2016-10-21 10 views
5

Ich habe gerade festgestellt, dass dies kompiliert ohne Fehler oder Warnungen mit -pedantic -Wall mit gcc und clang.Funktion als Parameter für Funktion

#include <stdio.h> 

int x = 0; 

void func(int f(const char *)) { 
    f("func()!"); 
} 

int main(void) { 
    func(puts); 
} 

Es scheint, dass der Parameter f wie Zeiger behandelt wird int (*)(const char *) in diesem Fall zu funktionieren.

Aber das ist ein Verhalten, das ich noch nie gesehen oder gehört habe. Ist das legale C-Code? Und wenn ja, was passiert, wenn Sie eine Funktion als Parameter für eine Funktion haben?

+1

Funktionszeiger sind gültige Parameter, mit denen Sie zB verschiedene Callback-Funktionen übergeben können. Die Funktion, die sie empfängt, kann diese Funktion dann aufrufen, kein Problem. –

+1

In diesem Fall wird der Typ des Parameters als "Funktion" und nicht als "Zeiger auf eine Funktion" geschrieben, in diesem Fall wäre stattdessen "int (* f) (const char *)" deklariert worden. – wefwefa3

+0

Dies ist syntaktischer Zucker und erlaubt es, Deklarationen leichter lesbar zu machen. Siehe den ersten Kommentar zur akzeptierten Antwort der doppelten Frage. –

Antwort

2

Es ist durch den Standard erlaubt. Aus C99-Standard Kapitel 6.9.1 (entnahm http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf):

Beispiel 2 eine Funktion zum anderen zu übergeben, könnte man sagen

int f(void); 
/*...*/ 
g(f); 

Dann wird die Definition von g

void g(int (*funcp)(void)) 
{ 
    /*...*/ 
    (*funcp)(); /* or funcp(); ... */ 
} 

lesen könnte

oder äquivalent

void g(int func(void)) 
{ 
    /*...*/ 
    func(); /* or (*func)(); ... */ 
} 
Verwandte Themen