Cosa significano le parentesi attorno al nome di una funzione?

In uno dei miei file sorgente del progetto, ho trovato questa definizione di funzione C:

int (foo) (int *bar) { return foo (bar); } 

Nota: non c‘è un asterisco accanto a foo , quindi non è un puntatore a funzione. O è? Cosa sta succedendo qui con la chiamata ricorsiva?

In assenza di processi pre-processori in corso, la firma di foo equivale a

 int foo (int *bar) 

L’unico contesto in cui ho visto persone mettere parentesi apparentemente inutili attorno ai nomi delle funzioni è quando ci sono sia una funzione che una macro simile a una funzione con lo stesso nome, e il programmatore vuole impedire l’espansione della macro.

Questa pratica può sembrare un po ‘strana all’inizio, ma la libreria C imposta un precedente fornendo alcune macro e funzioni con nomi identici .

Una di queste coppie funzione / macro è isdigit() . La libreria potrebbe definirlo come segue:

 /* the macro */ #define isdigit(c) ... /* the function */ int (isdigit)(int c) /* avoid the macro through the use of parentheses */ { return isdigit(c); /* use the macro */ } 

La tua funzione sembra quasi identica a quella sopra, quindi sospetto che questo sia ciò che sta accadendo nel tuo codice.

Le paratezze non cambiano la dichiarazione – si sta ancora definendo una funzione ordinaria chiamata foo .

Il motivo per cui sono stati utilizzati è quasi certamente perché esiste una macro simile a una funzione chiamata foo definita:

 #define foo(x) ... 

L’uso di (foo) nella dichiarazione della funzione impedisce che questa macro venga espansa qui. Quindi, ciò che probabilmente sta accadendo è che una funzione foo() viene definita con il suo corpo che viene espanso dalla macro foo simile alla funzione.

Le parentesi sono prive di significato.
Il codice che mostri non è altro che una ricorsione infinita.

Quando definisci un puntatore a funzione, a volte vedi parentesi strane che significano qualcosa. Ma questo non è il caso qui.