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.