#if et #define MY_MACRO (0)
L'utilisation de #if signifie que vous avez créé une macro "define", c'est-à-dire quelque chose qui sera recherché dans le code pour être remplacé par "(0)". C'est «l'enfer des macros» que je déteste voir en C ++, car il pollue le code avec des modifications potentielles du code.
Par exemple:
#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;
}
donne l'erreur suivante sur g ++:
main.cpp|408|error: lvalue required as left operand of assignment|
||=== Build finished: 1 errors, 0 warnings ===|
Une seule erreur.
Ce qui signifie que votre macro a interagi avec succès avec votre code C ++: l'appel à la fonction a réussi. Dans ce cas simple, c'est amusant. Mais ma propre expérience avec des macros jouant en silence avec mon code n'est pas pleine de joie et de plénitude, alors ...
#ifdef et #define MY_MACRO
Utiliser #ifdef signifie que vous «définissez» quelque chose. Non pas que vous lui donniez une valeur. Il est toujours polluant, mais au moins, il sera "remplacé par rien", et non vu par le code C ++ comme une instruction de code retardée. Le même code ci-dessus, avec une définition simple, il:
#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;
}
Donne les avertissements suivants:
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 ===|
Alors...
Conclusion
Je préfère vivre sans macros dans mon code, mais pour plusieurs raisons (définition de protections d'en-tête ou macros de débogage), je ne peux pas.
Mais au moins, j'aime les rendre le moins interactif possible avec mon code C ++ légitime. Ce qui signifie utiliser #define sans valeur, utiliser #ifdef et #ifndef (ou même #if défini comme suggéré par Jim Buck), et surtout, leur donner des noms si longs et si extraterrestres que personne dans son bon sens n'utilisera il "par hasard", et cela n'affectera en aucun cas le code C ++ légitime.
Post Scriptum
Maintenant, alors que je relis mon article, je me demande si je ne devrais pas essayer de trouver une valeur qui ne sera jamais correcte en C ++ à ajouter à ma définition. Quelque chose comme
#define MY_MACRO @@@@@@@@@@@@@@@@@@
qui pourrait être utilisé avec #ifdef et #ifndef, mais ne laissez pas le code se compiler s'il est utilisé dans une fonction ... J'ai essayé cela avec succès sur g ++, et cela a donné l'erreur:
main.cpp|410|error: stray ‘@’ in program|
Intéressant. :-)
#if
, vous pouvez également utiliser#elif
de manière cohérente, contrairement à#ifdef
. Ainsi, au lieu de simplement utiliser#define BLAH
, utilisez#define BLAH 1
avec#if BLAH
, etc ...