Macros C et utilisation des arguments entre parenthèses

Exemple

#define Echo(a) a #define Echo(a) (a) 

Je me rends compte qu’il n’y a probablement pas de différence significative ici, mais pourquoi voudriez-vous jamais inclure a entre parenthèses dans le corps de la macro? Comment cela change-t-il?

Supposons que vous ayez

 #define mul(x, y) x * y 

Qu’est-ce qui se passe si je dis:

 mul(a + 5, 6); /* a + 5 * 6 */ 

Maintenant si je change légèrement la macro:

 #define mul(x, y) ((x) * (y)) mul(a + 5, 6); /* ((a + 5) * (6)) */ 

Rappelez-vous, les arguments ne sont pas évalués ou quoi que ce soit, seule la substitution textuelle est effectuée.

MODIFIER

Pour une explication sur la macro entière entre parenthèses, voir le lien posté par Nate CK .

Pour mémoire, j’ai atterri à partir d’ici. Comment corriger les erreurs mathématiques lors de l’utilisation de macros et je vais essayer d’élargir cette Réponse à l’autre.

Vous parlez de la différence à propos de:

 #define Echo( a ) a #define Echo( a ) ( a ) 

ce qui est bien tant que vous ne comprenez pas la macro elle-même (je ne suis pas un expert aussi :)).

Tout d’abord, vous savez déjà (probablement) qu’il existe une préséance d’opérateur. Il existe donc une différence énorme entre ces deux programmes:

1):

 #include  #define ADD( a , b ) a + b int main( void ) { auto const int a = 5; auto const int b = 10; auto const int c = ADD ( 2 + a , 2 + b ); printf( "%d", c ); return 0; } 

Sortie:

 19 

et:

 #include  #define ADD( a , b ) ( a ) + ( b ) int main( void ) { auto const int a = 5; auto const int b = 10; auto const int c = ADD ( a , b ); printf( "%d", c ); return 0; } 

Sortie:

15

Maintenant, remplaçons + avec * :

 #define ADD( a, b ) a * b 

Le compilateur traite a * b comme par exemple a == 5 et b == 10 ce qui fait 5 * 10 .

Mais, quand vous dites: ADD ( 2 + a * 5 + b ) Comme ici:

 #include  #define ADD( a , b ) ( a ) * ( b ) int main( void ) { auto const int a = 5; auto const int b = 10; auto const int c = ADD ( 2 + a , 5 + b ); printf( "%d", c ); return 0; } 

Vous obtenez 105 , car la priorité de l’opérateur est impliquée et traite

2 + b * 5 + a

comme

( 2 + 5 ) * ( 5 + 10 )

lequel est

( 7 ) * ( 15 ) == 105

Mais quand tu fais:

 #include  #define ADD( a, b ) a * b int main( void ) { auto const int a = 5; auto const int b = 10; auto const int c = ADD ( 2 + a , 5 + b ); printf( "%d", c ); return 0; } 

vous en avez 37 cause de

  2 + 5 * 5 + 10 

ce qui signifie:

 2 + ( 5 * 5 ) + 10 

ce qui signifie:

 2 + 25 + 10 

Réponse courte, il y a une grande différence entre:

 #define ADD( a , b ) a * b 

et

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