#if y #define MY_MACRO (0)
El uso de #if significa que creó una macro "definir", es decir, algo que se buscará en el código para ser reemplazado por "(0)". Este es el "infierno macro" que odio ver en C ++, porque contamina el código con posibles modificaciones de código.
Por ejemplo:
#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;
}
da el siguiente error en g ++:
main.cpp|408|error: lvalue required as left operand of assignment|
||=== Build finished: 1 errors, 0 warnings ===|
Solo un error.
Lo que significa que su macro interactuó exitosamente con su código C ++: la llamada a la función fue exitosa. En este simple caso, es divertido. Pero mi propia experiencia con macros jugando silenciosamente con mi código no está llena de alegría y plenitud, así que ...
#ifdef y #define MY_MACRO
Usar #ifdef significa que "define" algo. No es que le des un valor. Todavía es contaminante, pero al menos, será "reemplazado por nada", y el código C ++ no lo verá como una declaración de código lagítima. El mismo código anterior, con una simple definición, 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;
}
Da las siguientes advertencias:
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 ===|
Entonces...
Conclusión
Prefiero vivir sin macros en mi código, pero por múltiples razones (definir protecciones de encabezado o depurar macros), no puedo.
Pero al menos, me gusta hacerlos lo menos interactivos posible con mi código C ++ legítimo. Lo que significa usar #define sin valor, usar #ifdef y #ifndef (o incluso #if definido como lo sugiere Jim Buck), y sobre todo, darles nombres tan largos y tan extraños que nadie en su sano juicio usará "por casualidad", y que de ninguna manera afectará al código C ++ legítimo.
Post Scriptum
Ahora, mientras vuelvo a leer mi publicación, me pregunto si no debería intentar encontrar algún valor que nunca sea C ++ correcto para agregar a mi definición. Algo como
#define MY_MACRO @@@@@@@@@@@@@@@@@@
que podría usarse con #ifdef y #ifndef, pero no permitir que el código se compile si se usa dentro de una función ... Intenté esto con éxito en g ++, y dio el error:
main.cpp|410|error: stray ‘@’ in program|
Interesante. :-)
#if
, también puede usarlo#elif
de manera coherente, a diferencia de con#ifdef
. Por lo tanto, en lugar de simplemente usar#define BLAH
, usar#define BLAH 1
con#if BLAH
, etc ...