== True
-
pumuckl schrieb:
kommt drauf an wie BOOL und TRUE definiert sind - normalerweise als einer der integralen Typen aus C und als 1. (z.B. #define BOOL long)
Beim casten von long nach bool gibts besagte Warnung. Beim Vergleich mit TRUE nicht - weil bLong und TRUE beide vom selben Typ (z.B. long) sind. Und es ist deshalb nicht das gleiche, weil bLong z.B. auch den Wert (TRUE + 1) haben könnte im ersten Fall (cast nach bool) gibt das immernoch true, im zweiten Fall (vergleich mit TRUE) gibts false.TRUE und blong vom gleichen Typ?
TRUE ist doch kein Typ sondern einfach nur 1 oder?Und es ist deshalb nicht das gleiche, weil bLong z.B. auch den Wert (TRUE + 1) haben könnte im ersten Fall (cast nach bool) gibt das immernoch true, im zweiten Fall (vergleich mit TRUE) gibts false.
Das verstehe ich nicht ganz.
-
Betidssa schrieb:
TRUE und blong vom gleichen Typ?
TRUE ist doch kein Typ sondern einfach nur 1 oder?TRUE ist kein Typ, es hat aber einen Typ. Wenns als
#define TRUE 1
definiert ists hats den Typ int. Vermutlich ists passend zu BOOL definiert, also z.B.#define BOOL int #define TRUE 1 //TRUE ist ein BOOL, weil 1 ein int ist //oder #define BOOL long #define TRUE 1L //TRUE ist ein BOOL weil 1L ein long ist
Betidssa schrieb:
Das verstehe ich nicht ganz.
Was daran verstehst du nicht?
BOOL bLong; // mache irgendwas mit bLong bool b1 = bLong; //b1 ist false, wenn bLong 0 ist, sonst true bool b2 = (bLong == TRUE); //b2 ist true, wenn bLong TRUE, also 1 ist. sonst false
wenn jetzt ein Spaßvogel z.B. irgendwo sagt bLong = 224; dann hat b1 den Wert true, b2 den Wert false. Deshalb sind die beiden abfragen nicht äquivalent.
-
wenn jetzt ein Spaßvogel z.B. irgendwo sagt bLong = 224; dann hat b1 den Wert true, b2 den Wert false
Warum das denn?
BOOL bLong = 224; // = TRUE
bool b1 = bLong; // auch TRUE ! bool b2 = (bLong == TRUE); // auch TRUE weil bLong == TRUE....bLong ist ja auch TRUE
-
Betidssa schrieb:
Warum das denn?
BOOL bLong = 224; // = TRUE
Eben nicht. TRUE ist meist als 1 definiert, FALSE als 0 andere Zahlen sind nicht vorgesehen. Es ist eben kein Vergleich wie beim eingebauten Datentyp bool, wo jede Zahl außer 0 true ist. bei den #defines ist 1 TRUE, 0 FALSE und alle anderen Zahlen sind weder das eine noch das andere.
-
Zut schrieb:
erledigt!
Du solltest deine Frage lieber stehen lassen, damit andere mit dem gleichen Problem später noch was davon haben. Dein "erledigt" kannst du doch im Titel ergänzen...
-
Und das hat jetzt welchen Sinn ? Solche #define s braucht erstens kein Mensch 2. Verwirrt das nur
-
Tim06TR schrieb:
Und das hat jetzt welchen Sinn ? Solche #define s braucht erstens kein Mensch 2. Verwirrt das nur
na den jenigen will ich sehen, der so was nicht braucht... ist doch total dämlich, dann ständig fkt zu haben, die nen int (bzw long) zurückgeben und in der doku steht immer: returns 1(success) or 0(failure)...
if(do_x() == 1)
wunderhübsch, dann doch lieber
if(do_x() == TRUE)
- das es in C++ auch noch anders geht ist (mittlerweile) hoffentlich so klar, dass ich das einfach unter den tisch fallen lassen kann^^C hat nun mal kein bool... (z.bsp.) die WinAPI ist aber in C geschrieben...
und ob man dort nun typedefs oder aber makros nimmt, macht imho ca. gar keinen unterschied...bb
-
Das C kein bool hat... das ist... unglaublich, muss das eben oben übersehen haben,
Dann macht das ja irgendwo doch sinn.
Kein bool ? Wie schrottig
-
unskilled schrieb:
und ob man dort nun typedefs oder aber makros nimmt, macht imho ca. gar keinen unterschied...
Aber es würde sehr wohl einen Unterschied machen,
enum
zu nehmen.
-
Nexus schrieb:
unskilled schrieb:
und ob man dort nun typedefs oder aber makros nimmt, macht imho ca. gar keinen unterschied...
Aber es würde sehr wohl einen Unterschied machen,
enum
zu nehmen.welche vorteile siehst du denn darin?
ich seh da nicht so wirklich ne besserung...bb
-
unskilled schrieb:
Nexus schrieb:
unskilled schrieb:
und ob man dort nun typedefs oder aber makros nimmt, macht imho ca. gar keinen unterschied...
Aber es würde sehr wohl einen Unterschied machen,
enum
zu nehmen.welche vorteile siehst du denn darin?
ich seh da nicht so wirklich ne besserung...bb
enum MyBool...
MyBool a = myBoolTrue;
int b = myBoolTrue; // error
-
unskilled schrieb:
welche vorteile siehst du denn darin?
ich seh da nicht so wirklich ne besserung...Typsicherheit. asdasasdasd hat es allerdings gerade verkehrt herum gezeigt.
enum BOOL { FALSE, TRUE, }; BOOL a = 3252; // Fehler
Ist dann allerdings wieder blöd wegen solchen Sachen (bräuchte eine Funktion):
BOOL b = (78 && 0);
Ein
bool
-Ansatz wie in C++ ist schon das beste.
-
Nexus schrieb:
enum BOOL { FALSE, TRUE, }; BOOL a = 3252; // Fehler
Das wäre in C allerdings kein Fehler.
-
unskilled schrieb:
C hat nun mal kein bool... (z.bsp.) die WinAPI ist aber in C geschrieben...
Falsch, siehe _Bool und stdbool.h
unskilled schrieb:
und ob man dort nun typedefs oder aber makros nimmt, macht imho ca. gar keinen unterschied...
Falsch
#define Bool int void foo() { int Bool = 1; } // vs. typedef int Bool; void foo() { int Bool = 1; }
(Wobei ich wie Nexus auch ein enum nehmen würde)
-
camper schrieb:
Nexus schrieb:
enum BOOL { FALSE, TRUE, }; BOOL a = 3252; // Fehler
Das wäre in C allerdings kein Fehler.
Bei mir (Freescale-Compiler) gibt es eine Warnung, wenn ich einem enum-Typ etwas anderes zuweise.
-
rüdiger schrieb:
unskilled schrieb:
C hat nun mal kein bool... (z.bsp.) die WinAPI ist aber in C geschrieben...
Falsch, siehe _Bool und stdbool.h
ok, wusste ich nicht, dass das mit dem 99er Standard eingeführt wurde^^
ist die winapi die einzige (wichtige) api, die trotzdem auf bool verzichtet oder hat das iwelche gründe?rüdiger schrieb:
unskilled schrieb:
und ob man dort nun typedefs oder aber makros nimmt, macht imho ca. gar keinen unterschied...
Falsch
#define Bool int void foo() { int Bool = 1; } // vs. typedef int Bool; void foo() { int Bool = 1; }
naja - 1. ist es BOOL, 2. ist dieser nachteil von makros allg. bekannt 3. ist es dummheit, bezeichner á la BOOL zu nehmen
Ein bool-Ansatz wie in C++ ist schon das beste
darauf wollte ich hinaus^^ ohne gibt es iwie immer nur halb-gute wegebb
-
unskilled schrieb:
Falsch, siehe _Bool und stdbool.h
ok, wusste ich nicht, dass das mit dem 99er Standard eingeführt wurde^^
ist die winapi die einzige (wichtige) api, die trotzdem auf bool verzichtet oder hat das iwelche gründe?Wie ich vermutet habe Abwärtskompatibilität:
http://blogs.msdn.com/oldnewthing/archive/2004/12/22/329884.aspx
Eigentlich liegt das doch auf der Hand, wenn man bedenkt, dass es Windows bereits vor 99 gegeben hat.
-
drakon schrieb:
unskilled schrieb:
Falsch, siehe _Bool und stdbool.h
ok, wusste ich nicht, dass das mit dem 99er Standard eingeführt wurde^^
ist die winapi die einzige (wichtige) api, die trotzdem auf bool verzichtet oder hat das iwelche gründe?Wie ich vermutet habe Abwärtskompatibilität:
http://blogs.msdn.com/oldnewthing/archive/2004/12/22/329884.aspx
Eigentlich liegt das doch auf der Hand, wenn man bedenkt, dass es Windows bereits vor 99 gegeben hat.
es gibt so viele dinge, die man über schalter lösen könnte(siehe NOMINMAX), das könnte man mit sicherheit auch dort tun... aber ty für link : >
bb
-
camper schrieb:
Das wäre in C allerdings kein Fehler.
Oh, ich wusste gar nicht, dass das erst mit C++ kam. Aber dann scheint mir ein wichtiger Vorteil von
enum
in C wegzufallen. Gegenüber#define
ist man bezüglich Scope, Debugsichtbarkeit und eventuellen Compilerwarnungen im Vorteil, aber wie verhält es sich mitconst
-Variablen? Besteht hier die einzige Verbesserung vonenum
darin, Konstanten nicht wegcasten zu können?
-
unskilled schrieb:
es gibt so viele dinge, die man über schalter lösen könnte(siehe NOMINMAX), das könnte man mit sicherheit auch dort tun... aber ty für link : >
bb
Wie meinst du das? - Ich fände es völlig sinnfrei die alten Library umschreiben zu gehen, nur damit da ein bool, anstatt ein BOOL steht.. (ich stelle mir gerade so vor, dass das irgendeinen Nebeneffekt geben würde und Code nicht mehr geht.. - Das wäre die wahre Wirtschaftskrise. :p)