/ / Pourquoi on a besoin de deux crochets pour utiliser des macros en c / c ++? - c, macros

Pourquoi faut-il deux crochets pour utiliser les macros dans c / c ++? - c, macros

    KdPrint(("Enter HelloWDMAddDevicen"));

Quelle est la raison de cela?

Réponses:

7 pour la réponse № 1

C'est ainsi que vous pouvez passer une liste d'arguments entière à la macro et la faire passer à une fonction qui prend un nombre variable d'arguments.

Je parierais tout ce que la définition de cette macro est:

#if DEBUG /* or something like it */
#define KdPrint(args) (printf args)
#else
#define KdPrint(args) /* empty */
#endif

Ou similaire à une autre fonction qui fonctionne exactement comme printf.

S'il était défini comme printf (args), vous ne pourriez passer que l'argument chaîne unique, car un argument à une macro ne peut pas "t contenir une virgule qui n'est pas" à l'intérieur d'une parenthèse imbriquée.


3 pour la réponse № 2

Si la macro en question n'a pas été bien écrite à l'aide de parenthèses, cela peut être nécessaire en raison de la priorité de l'opérateur. Prenez cette macro par exemple:

#define MY_MACRO(a) a * 11

Eh bien, si vous avez fait ça:

int b = MY_MACRO(1 + 2);

b, au lieu d'être 33 comme il se doit, serait en fait remplacé par int b = 1 + 2 * 11 qui est 23 et non 33. Si votre macro n'est pas écrite comme ça, cependant (sans parenthèses autour de la a) alors c'est inutile.


3 pour la réponse № 3

Il fait en sorte que tout ce qui se trouve à l'intérieur des parens est traité comme un paramètre unique de la macro. Dans l'exemple illustré, il peut autoriser des types de paramètres varargs:

KdPrint(( "My info is %sn", "my name" ));

Aussi bien que

KdPrint(( "fn %s ln %sn", "my", "name" ));

1 pour la réponse № 4

Si ce est le KdPrint() dont vous parlez, c'est parce que vous pouvez utiliser KdPrint() macro avec des arguments de format, et ce n'est pas une macro de longueur variable.

Par exemple, vous pouvez faire:

KdPrint(("The answer is %dn", 42));

etc.


0 pour la réponse № 5

Pour votre exemple spécifique, je ne peux pas vous le dire, car je ne sais pas ce qu'est XdPrint.

Mais dans un cas plus général, c'est parce qu'une macro que j'aime juste une recherche et un remplacement. Supposons que vous ayez:

#define MULT(a,b) (a*b)

Si vous appelez MULT(1+1, 2+2), il deviendrait 1+1*2+2, et résulte en 5 au lieu de 8 comme vous vous en doutez. Faire MULT((1+1), (2+2)) vous donne le résultat attendu. C'est pourquoi vous devez doubler les crochets.