/ / Macro C semblable à une fonction sans parenthèses - c, débogage, macros

Macro C semblable à une fonction sans parenthèses - c, débogage, macros

J'ai rencontré la macro de débogage suivante dans un codebase de périphérique intégré:

extern void DebugPrint(uint8_t *s);

#define DEBUG_MSG(x)   do { PRINT_CURRENT_TIME; 
DebugPrint x ; } while(0)

Puisqu'il n'y a pas de parenthèses autour x dans le corps macro (à la DebugPrint x partie), tous les appels à cette macro (partout dans la base de code) ajoutent un autre jeu de parenthèses autour des chaînes:

DEBUG_MSG(("some debug text"));

Y a-t-il une raison de faire cela? Cela simplifie-t-il l'optimisation de ces appels dans les versions de version, ou quelque chose comme ça? Ou est-ce simplement un non-sens?

Je pensais qu'il y aurait peut-être des surcharges supplémentaires de DebugPrint avec plus d'arguments, mais il n'y en a pas.

Réponses:

9 pour la réponse № 1

Voici une théorie:

Le préprocesseur analyse les arguments d’une extension de macro d’une manière qui imite l’analyse de l’expression du compilateur. En particulier, il analyse les termes entre parenthèses en tant qu’argument unique.

Alors le DEBUG_MSG L’intention de l’auteur aurait peut-être été de faire respecter l’utilisation des parenthèses.

Cela peut avoir un sens lorsque le DebugPrint fonction d'impression serait en fait un printf style variadique une fonction. Vous pouvez appeler la fonction avec un seul littéral de chaîne ou avec un nombre variable d'arguments:

DEBUG_MSG(("reached this point in code"));

DEBUG_MSG(("value of x = %i", x));

Mais ceci n’est que pure spéculation. Pouvez-vous simplement demander à l'auteur?


1 pour la réponse № 2

Je crois que non. Les macros sont remplacées par le compilateur, elles n'ont donc rien à voir avec les vitesses d'exécution. Ce:

#define MACRO(x) do_something(x)
MACRO("test");

N'est-ce pas différent

#define MACRO(x) do_something x
MACRO(("test"));

Puisque le compilateur les remplacera tous les deux avec le même résultat:

do_something("test");

qui sera ensuite compilé pour produire le même code objet.