C macro, algo raro

Intentar descubrir algo simple en una macro C, como este código, por ejemplo:

#include  #define MACRO(b) printf("%d\n", b*b) int main() { MACRO(4+1); } 

La salida para este código es 9, creo que debería ser 25. No tengo ni idea de por qué y cómo el resultado es 9 y no 25.

Cuando usa la macro, el preprocesador la reemplaza y sus argumentos son bastante literales, por lo que la expansión de la macro en su código se verá así

 printf("%d\n", 4+1*4.1); 

Eso no le proporcionará el resultado que desea, y es una de las razones por las que las macros similares a funciones son menospreciadas.

Debe usar paréntesis para asegurarse de que este problema no se produce:

 #define MACRO(b) printf("%d\n", (b)*(b)) 

mientras que entonces resultará en la siguiente expansión:

 printf("%d\n", (4+1)*(4.1)); 

Siempre que tenga problemas con algo relacionado con el preprocesador, hay opciones para que casi todos los comstackdores se detengan después de la etapa de preprocesamiento, lo que le permite ver la fuente preprocesada y lo ayudará con este tipo de problemas.


También tenga en cuenta que otro problema posible aquí es si la expresión que pasa como argumento a la macro es, por ejemplo, una llamada de función con algún efecto secundario, se llamará a la función dos veces y el efecto secundario se producirá dos veces, incluso cuando se utilicen paréntesis.

Un ejemplo simple, usando tu macro:

 int my_function(void) { printf("Foo\n"); return 1; } int main(void) { MACRO(my_function()); } 

El progtwig anterior imprimirá "Foo\n" dos veces . Si MACRO fuera una función adecuada, la llamada a my_function solo ocurriría una vez y la impresión de la función solo ocurriría una vez.

Coloque paréntesis alrededor de su macro para evaluar los argumentos en el orden correcto:

 #include  #define MACRO(b) printf("%d\n", (b)*(b)) int main() { MACRO(4+1); }