43 votes

Macros de fonction vides

Si je définis une macro de fonction sans corps réel, est-ce comme une chaîne vide avec le compilateur (c'est-à-dire qu'elle ne génère aucune instruction supplémentaire au moment de la compilation) ?

Exemple:

 #define SomeMacro(a)

SomeMacro("hello"); // This line doesn't add any instructions, does it?

55voto

Mark Ransom Points 132545

Vous avez tout à fait raison, la macro vide ne génère aucun code.

J'ai vu deux endroits où cela est utile. La première consiste à éliminer les avertissements lorsqu'un paramètre de fonction n'est pas utilisé :

 #define UNUSED(x)

int foo(int UNUSED(value))
{
    return 42;
}

La seconde est lorsque vous utilisez des conditions pour déterminer s'il doit y avoir du code ou non.

 #ifdef LOGGING_ENABLED
#define LOG(x) log_message(x)
#else
#define LOG(x)
#endif

6voto

Cody Gray Points 102261

Le préprocesseur effectue une substitution littérale avec toutes les macros.

Par conséquent, si vous définissez une macro "vide", chaque endroit où cet identifiant apparaît dans votre code sera remplacé par une instruction vide par le préprocesseur avant que le compilateur ne s'exécute.

Donc oui. Aucun code ne sera généré pour l'exemple donné dans votre question.

6voto

Greg Hewgill Points 356191

C'est correct. Votre code se développe en

 ;

après prétraitement.

Notez que vous pouvez demander à votre compilateur de vous montrer le code après prétraitement (dans gcc, c'est l' -E ; votre compilateur peut varier).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X