2016-10-21 12 views
5

-pedantic -Wallgccclangの両方を使用して、エラーまたは警告なしにコンパイルすることに気がつきました。関数のパラメータとしての関数

#include <stdio.h> 

int x = 0; 

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

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

パラメータfが、この場合にint (*)(const char *)を関数へのポインタのように扱われていることが表示されます。

しかしこれは私が一度も見たことがない、または聞いたことのない行動です。この正当なCコードですか?もしそうなら、関数のパラメータとしての関数を持っているとどうなりますか?

+1

ファンクションポインタは有効なパラメータです。たとえば、さまざまなコールバック関数を渡すことができます。それらを受け取る関数は、その関数を呼び出すことができます。問題はありません。 –

+1

この場合、パラメータの型は "関数へのポインタ"ではなく、 "int(* f)(const char *)"として宣言されています。 – wefwefa3

+0

これは構文的な砂糖であり、宣言を読みやすくすることができます。重複した質問の受け入れられた答えに対する最初のコメントを見てください。 –

答えて

2

これは標準で許可されています。 C99標準の章6.9.1から(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdfから取った):1は次にグラムの定義は読むかもしれない

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

を言うかもしれないが、別の関数を渡すために

例2

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

または、等価的に、

​​
関連する問題