Haben Makros Scopes ?
-
hi,
hab so das gefuehl, dass ist das falsche forum aber was solls. ganz einfache frage: warum ist folgendes so, wie es ist ?inline void set () { #ifndef FLAG #define FLAG #endif }; inline void release () { #ifdef FLAG #undef FLAG #endif };
wenn ich nun irgendwo in main ()
#ifdef FLAG
abfrage kommt dabei immer false raus. liegt es daran, dass makros scopes haben oder habe ich da was uebersehen.
danke schon mal im voraus fuer die ( kompetenten ? ) antworten.was auch immer
-
defines haben keinen eigenen Scope. In welcher Reihenfolge hast du die Funktionen defieniert inkl. main?
-
so simple wie es nur geht. hier mal ein beispiel programm :
#include <iostream> inline void set () { #ifndef FLAG #define FLAG #endif }; inline void release () { #ifdef FLAG #undef FLAG #endif }; int main () { set (); #ifdef FLAG std::cout << "Flag is set.\n"; #endif release (); #ifndef FLAG std::cout << "Flag is released.\n"; #endif std::cin.get (); return 0; };
ausgabe:
Flag is released.
was auch immer
-
was auch immer schrieb:
ausgabe:
Flag is released.
was auch immer
Schau mal in dein Buch. Da steht sicher drin, dass die Präprozessorsymbole ausgewertet werden, bevor der Compiler den Code parst.
Somit ist das Verhalten des Codes ganz klar.
-
danke shade. meine frage waere geklaert.
was auch immer
-
@Shade Of Mine
Wenn das aber so ist, so erkläre mir doch bitte, wie diese Ausgabe zustande kommt.
-
Hallo,
Was verstehst du daran nicht
inline void set () { #ifndef FLAG // FLAG wurd noch nicht definiert also ab in define #define FLAG // FLAG ist jetzt definiert #endif }; inline void release () { #ifdef FLAG //dieser ausdruck ist wahr, da FLAG oben definiert wurde #undef FLAG //FLAG wird auf nicht-definiert gesetzt #endif }; int main () { set (); #ifdef FLAG std::cout << "Flag is set.\n"; //wird nicht ausgeführt da FLAG nicht definiert ist #endif release (); #ifndef FLAG std::cout << "Flag is released.\n"; //Wird ausgeführt weil FLAG nicht defniert ist #endif //....
-
Und wie kann es sein, dass das folgende Programm für funk 6 und in main 66 ausgibt, wenn ich a redefiniert habe? Es zählt doch bei einer Redefinition immer der zuletzt eingetragene Wert, oder?
#include <iostream.h> #define a 77 void funk() { #define a 9 cout << "In Funk: " << a << '\n'; } void main() { #define a 66 funk(); cout << "In main: " << a << '\n'; }
/EDIT
Ich habe mir das erste Programm nicht richtig durchgelesen, klar passt das so. Wie dumm von mir....
-
Kann mir denn keiner beantworten, warum obiges geht?
-
Nachdem der Präprozessor den Code durchgegangen ist dürfte der Code so aussehen:
#include <iostream.h> void funk() { cout << "In Funk: " << 9 << '\n'; } void main() { funk(); cout << "In main: " << 66 << '\n'; }
das dürfte wohl verständlich sein...
btw: ist es denn laut standard erlaubt ein define nochmal zu definen? muss man nicht erst ein #undef benutzen?
-
MASTERMIKE schrieb:
Kann mir denn keiner beantworten, warum obiges geht?
Klar, aber die Frage wurde hinreichend geklärt.