#if e #define MY_MACRO (0)
Usar #if significa que você criou uma macro "definir", ou seja, algo que será pesquisado no código para ser substituído por "(0)". Este é o "inferno da macro" que odeio ver em C ++, porque polui o código com possíveis modificações de código.
Por exemplo:
#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á o seguinte erro no g ++:
main.cpp|408|error: lvalue required as left operand of assignment|
||=== Build finished: 1 errors, 0 warnings ===|
Apenas um erro.
O que significa que sua macro interagiu com sucesso com seu código C ++: A chamada para a função foi bem-sucedida. Neste caso simples, é divertido. Mas minha própria experiência com macros brincando silenciosamente com meu código não é cheia de alegria e realização, então ...
#ifdef e #define MY_MACRO
Usar #ifdef significa que você "define" algo. Não que você dê um valor. Ainda é poluente, mas pelo menos será "substituído por nada" e não será visto pelo código C ++ como uma instrução de código lagitima. O mesmo código acima, com uma definição simples, ele:
#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;
}
Dá os seguintes avisos:
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 ===|
Assim...
Conclusão
Prefiro viver sem macros em meu código, mas por vários motivos (definir protetores de cabeçalho ou macros de depuração), não posso.
Mas, pelo menos, gosto de torná-los o menos interativos possível com meu código C ++ legítimo. O que significa usar #define sem valor, usando #ifdef e #ifndef (ou mesmo #if definido como sugerido por Jim Buck) e, acima de tudo, dando-lhes nomes tão longos e tão estranhos que ninguém em sã consciência usará isso "por acaso", e de forma alguma afetará o código C ++ legítimo.
Post Scriptum
Agora, enquanto relendo meu post, me pergunto se não devo tentar encontrar algum valor que jamais será C ++ correto para adicionar à minha definição. Algo como
#define MY_MACRO @@@@@@@@@@@@@@@@@@
que poderia ser usado com #ifdef e #ifndef, mas não deixe o código compilar se usado dentro de uma função ... Eu tentei isso com sucesso no g ++ e deu o erro:
main.cpp|410|error: stray ‘@’ in program|
Interessante. :-)
#if
, você também pode usar de#elif
maneira consistente, ao contrário de#ifdef
. Assim, em vez de apenas usar#define BLAH
, use#define BLAH 1
com#if BLAH
, etc ...