#if e #define MY_MACRO (0)
Usare #if significa che hai creato una macro "define", cioè qualcosa che verrà cercato nel codice per essere sostituito da "(0)". Questo è l '"inferno delle macro" che odio vedere in C ++, perché inquina il codice con potenziali modifiche al codice.
Per esempio:
#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;
}
dà il seguente errore su g ++:
main.cpp|408|error: lvalue required as left operand of assignment|
||=== Build finished: 1 errors, 0 warnings ===|
Uno solo errore.
Ciò significa che la tua macro ha interagito con successo con il tuo codice C ++: la chiamata alla funzione ha avuto successo. In questo semplice caso, è divertente. Ma la mia esperienza con le macro che giocano silenziosamente con il mio codice non è piena di gioia e appagamento, quindi ...
#ifdef e #define MY_MACRO
Usare #ifdef significa "definire" qualcosa. Non che tu gli dia un valore. È ancora inquinante, ma almeno sarà "sostituito da niente" e non sarà visto dal codice C ++ come dichiarazione di codice lagitimate. Lo stesso codice sopra, con una semplice definizione, esso:
#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;
}
Fornisce le seguenti avvertenze:
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 ===|
Così...
Conclusione
Preferisco vivere senza macro nel mio codice, ma per diversi motivi (definizione di protezioni per intestazioni o macro di debug), non posso.
Ma almeno, mi piace renderli il meno interattivi possibile con il mio codice C ++ legittimo. Il che significa usare #define senza valore, usare #ifdef e #ifndef (o anche #if definito come suggerito da Jim Buck) e, soprattutto, dare loro nomi così lunghi e così alieni che nessuno sano di mente userà "per caso", e questo non influirà in alcun modo sul codice C ++ legittimo.
Post scriptum
Ora, mentre sto rileggendo il mio post, mi chiedo se non dovrei provare a trovare qualche valore che non sarà mai corretto in C ++ da aggiungere alla mia definizione. Qualcosa di simile a
#define MY_MACRO @@@@@@@@@@@@@@@@@@
che potrebbe essere usato con #ifdef e #ifndef, ma non lasciare che il codice si compili se usato all'interno di una funzione ... L'ho provato con successo su g ++ e ha dato l'errore:
main.cpp|410|error: stray ‘@’ in program|
Interessante. :-)
#if
, puoi anche usare#elif
in modo coerente, a differenza di#ifdef
. Quindi, invece di usare#define BLAH
, usa#define BLAH 1
con#if BLAH
, ecc ...