Fonction d’appel sans paramètre ni parenthèse

Dans l’extrait de code suivant, la fonction principale appelle la fonction foo sans paramètre ni parenthèse. Il est étrange que ce code puisse être compilé par gcc. En fait, je vérifie le code de l’assembly et découvre que le compilateur ignore simplement cette ligne. Donc ma question est dans quelle situation ce type de code est utilisé? Ou bien le support de gcc est juste une coïncidence et en fait, il est totalement inutile.

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

Son code d’assemblage vidé par 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) 

Ce n’est pas différent d’avoir n’importe quel autre type d’expression et d’ignorer sa valeur, comme:

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

il n’y a rien de spécial, cela n’appelle pas la fonction puisque les opérateurs d’appel de fonction () ne sont pas utilisés. Vous ne faites que “calculer” l’adresse des fonctions, puis l’ignorer.

L’expression foo est évaluée (donnant l’adresse de la fonction) et le résultat est ignoré. Sans l’opérateur () , la fonction n’est pas appelée.

foo n’est pas appelé, il est simplement référé (et n’est affecté à rien).