2014-11-27 7 views
5

Recentemente ho appreso che questo è C legale:sintassi alternativa per le funzioni C che assumono un'altra funzione come parametro

#include <stdio.h> 

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

int bar(int x) 
{ 
    return x * 42; 
} 

int main() 
{ 
    printf("Baz = %d\n", foo(bar)); 
    return 0; 
} 

compila senza avvisi e viene eseguito come previsto (compila e funziona bene anche come un programma C, piuttosto che C++)

rep ~/Documents $ g++ -Wall test.cpp 
rep ~/Documents $ ./a.out 
Baz = 1764 
rep ~/Documents $ 

Perché non è questa sintassi utilizzati più spesso o addirittura menzionato da nessuna parte?

+2

Interessante ... non ho visto quella sintassi prima di me. Mi sarei aspettato che la firma leggesse 'int foo (int (* bar) (int))'. – bgoldst

+7

Negli elenchi di parametri, i tipi di funzione sono regolati su puntatore-a-funzione, proprio come il tipo di matrice viene regolato su puntatore-elemento. –

+1

È esattamente uguale a 'int foo (int (* bar) (int))'. Non so perché non è usato spesso però. – 0x499602D2

risposta

-6

Forse perché è possibile chiamare una funzione all'interno di un'altra funzione. È meglio chiarire che funzionare come parametro. Sebbene sia utilizzato dai framework per eseguire le funzioni di callback. Preferisco la funzione da un'altra funzione come sviluppatore normale.

+0

Questo non ha nulla a che fare con le funzioni di chiamata all'interno di altre funzioni. Il suo punto è sull'uso della sintassi diversa dal puntatore alla sintassi della funzione. –