#if und #define MY_MACRO (0)
Die Verwendung von #if bedeutet, dass Sie ein "Define" -Makro erstellt haben, dh etwas, das im Code durchsucht wird, der durch "(0)" ersetzt werden soll. Dies ist die "Makro-Hölle", die ich in C ++ nicht gerne sehe, weil sie den Code mit möglichen Code-Änderungen verschmutzt.
Beispielsweise:
#define MY_MACRO (0)
int doSomething(int p_iValue)
{
return p_iValue + 1 ;
}
int main(int argc, char **argv)
{
int MY_MACRO = 25 ;
doSomething(MY_MACRO) ;
return 0;
}
gibt den folgenden Fehler auf g ++:
main.cpp|408|error: lvalue required as left operand of assignment|
||=== Build finished: 1 errors, 0 warnings ===|
Nur ein Fehler.
Dies bedeutet, dass Ihr Makro erfolgreich mit Ihrem C ++ - Code interagiert hat: Der Aufruf der Funktion war erfolgreich. In diesem einfachen Fall ist es amüsant. Aber meine eigene Erfahrung mit Makros, die lautlos mit meinem Code spielen, ist nicht voller Freude und Erfüllung, also ...
#ifdef und #define MY_MACRO
Die Verwendung von #ifdef bedeutet, dass Sie etwas "definieren". Nicht, dass du ihm einen Wert gibst. Es ist immer noch umweltschädlich, aber zumindest wird es "durch nichts ersetzt" und von C ++ - Code nicht als verzögerte Code-Anweisung angesehen. Der gleiche Code oben, mit einer einfachen Definition, es:
#define MY_MACRO
int doSomething(int p_iValue)
{
return p_iValue + 1 ;
}
int main(int argc, char **argv)
{
int MY_MACRO = 25 ;
doSomething(MY_MACRO) ;
return 0;
}
Gibt die folgenden Warnungen:
main.cpp||In function ‘int main(int, char**)’:|
main.cpp|406|error: expected unqualified-id before ‘=’ token|
main.cpp|399|error: too few arguments to function ‘int doSomething(int)’|
main.cpp|407|error: at this point in file|
||=== Build finished: 3 errors, 0 warnings ===|
So...
Fazit
Ich würde lieber ohne Makros in meinem Code leben, aber aus mehreren Gründen (Definieren von Header Guards oder Debuggen von Makros) kann ich nicht.
Aber zumindest möchte ich sie mit meinem legitimen C ++ - Code so wenig interaktiv wie möglich gestalten. Was bedeutet, dass Sie #define ohne Wert verwenden, #ifdef und #ifndef verwenden (oder sogar #if, wie von Jim Buck vorgeschlagen), und vor allem, wenn Sie ihnen Namen geben, die so lang und so fremd sind, dass niemand, der bei klarem Verstand ist, sie verwenden wird es "durch Zufall", und das wird in keiner Weise legitimen C ++ - Code beeinflussen.
Post Scriptum
Jetzt, während ich meinen Beitrag erneut lese, frage ich mich, ob ich nicht versuchen sollte, einen Wert zu finden, der niemals richtig sein wird, um C ++ zu meiner Definition hinzuzufügen. Etwas wie
#define MY_MACRO @@@@@@@@@@@@@@@@@@
Das könnte mit #ifdef und #ifndef verwendet werden, aber Code darf nicht kompiliert werden, wenn er innerhalb einer Funktion verwendet wird ... Ich habe dies erfolgreich in g ++ versucht und es gab den Fehler:
main.cpp|410|error: stray ‘@’ in program|
Interessant. :-)
#if
können Sie#elif
im Gegensatz zu auch auch konsistent verwenden#ifdef
. Also, anstatt nur zu verwenden#define BLAH
, verwenden Sie#define BLAH 1
mit#if BLAH
, etc ...