Función de llamada sin parámetro y paréntesis.

En el siguiente fragmento de código, la función principal llama a foo function sin ningún parámetro ni paréntesis. Es extraño que este código pueda ser comstackdo por gcc. Verifico el código de ensamblaje y descubro que el comstackdor simplemente ignora esta línea. Entonces mi pregunta es ¿en qué situación se usa este tipo de código? O el soporte de gcc es solo una coincidencia y en realidad es totalmente inútil.

int foo(int a,int b) { return a+b; } int main() { foo; // call foo without parameter and parenthesis return 0; } 

Su código de assembly volcado por objdump -d

 00000000004004c0 : 4004c0: 55 push %rbp 4004c1: 48 89 e5 mov %rsp,%rbp 4004c4: b8 00 00 00 00 mov $0x0,%eax 4004c9: 5d pop %rbp 4004ca: c3 retq 4004cb: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 

Esto no es diferente a tener cualquier otro tipo de expresión e ignorar su valor, como:

 int main(void) { 42; return 0; } 

no hay nada especial, esto no está llamando a la función ya que los operadores de llamada de función () no se están utilizando. Todo lo que estás haciendo es “calcular” la dirección de las funciones, luego ignorarla.

La expresión foo se evalúa (dando la dirección de la función) y el resultado se descarta. Sin el operador () , la función no se llama.

foo no está siendo llamado, solo es referido (y no asignado a nada).