¿Qué está pasando en este código C? (De la entrevista)

Recibí una variación de este código C en una entrevista recientemente, y le pregunté qué me devolvería la función.

#define fun(a) a*a int main() { return(fun(4+5)); } 

Lo ejecuté con un printf("%d"...) en lugar de la devolución y se imprime a 29. Ningún otro tipo que “% d” mostró un resultado. ¿Alguien puede explicar lo que está pasando aquí?

a se expande, no se evalúa como a . Así que tienes:

 4+5*4+5 

y con las prioridades del operador; obtienes 4 + 20 + 5 => 29

Mejor manera (con paréntesis externo adicional para proteger contra operadores externos también gracias al comentario de Thomas):

 #define fun(a) ((a)*(a)) 

pero todos los paréntesis del mundo aún no protegen contra i++ , llamadas a funciones (con efectos secundarios, preferiblemente) … así que reusar los argumentos en macros siempre es un problema (tampoco hay syntax para declarar y asignar una variable temporal). Prefiere las funciones en línea en ese caso.