Macros C y uso de argumentos entre paréntesis

Ejemplo

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

Me doy cuenta de que probablemente no haya una diferencia significativa aquí, pero ¿por qué querrías incluir el a entre paréntesis dentro del macro cuerpo? ¿Cómo lo altera?

Supongamos que tiene

 #define mul(x, y) x * y 

Que pasa si digo:

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

Ahora si poco cambio la macro:

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

Recuerde, los argumentos no se evalúan ni nada, solo se realiza la sustitución textual.

EDITAR

Para obtener una explicación acerca de tener toda la macro entre paréntesis, vea el enlace publicado por Nate CK .

Solo para el registro, llegué desde Here How para corregir errores matemáticos mientras uso macros e intentaré expandir esta respuesta aquí para adaptarme al Otro.

Usted está preguntando sobre la diferencia acerca de:

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

lo cual está bien siempre y cuando no comprenda la macro propia (yo tampoco soy un experto :)).

En primer lugar, ya sabes (probablemente) que existe Precedencia del operador, por lo que hay una gran diferencia entre estos dos progtwigs:

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; } 

Salida:

 19 

y:

 #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; } 

Salida:

15

Ahora permite preplace + con * :

 #define ADD( a, b ) a * b 

El comstackdor trata a * b como por ejemplo a == 5 b == 10 que hace 5 * 10 .

Pero, cuando dices: ADD ( 2 + a * 5 + b ) Como aquí:

 #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; } 

Obtienes 105 , porque la precedencia del operador está involucrada y trata

2 + b * 5 + a

como

( 2 + 5 ) * ( 5 + 10 )

cual es

( 7 ) * ( 15 ) == 105

Pero cuando lo haces:

 #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; } 

obtienes 37 debido a

  2 + 5 * 5 + 10 

lo que significa:

 2 + ( 5 * 5 ) + 10 

lo que significa:

 2 + 25 + 10 

Respuesta corta, hay una gran diferencia entre:

 #define ADD( a , b ) a * b 

y

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