2017-01-04 13 views
1

以下に述べるように関数ポインタを引数とする関数を宣言すると、コンパイラはエラーをスローします。誰かがなぜ "void func_dec(void(*)(int)funcptr);"は無効です

void func_dec(int x, void(*)() funcptr); 

それが宣言の下に受け入れるのに対し、それは論理的に見えるものの、コンパイラは、元の宣言を認識できなかったのはなぜ

void func_dec(int x, void(*funcptr)()); 

void(*)() funcptr 

は、それ自身に無効な構文である、ので

+16

これは文法で指定された構文ではないためです。 –

+0

C言語で関数を宣言するときに、正確に何が働くのかを知っておくことを強く推奨します。アイデアがなければ、それについて読むべきです。私はあなたが達成しようとしていることを理解しておらず、そのような複雑な宣言がなぜ必要なのですか? –

+0

http://cdecl.org/は、複雑なCタイプを構築するのに役立ちます。 –

答えて

1

です。関数宣言を書きながら

はちょうどそれが十分でなければなりません

void func_dec(int , void(*)()); 

タイプを供給しています。それ以外の場合は、変数名も指定する場合は、

void func_dec(int x, void(*funcptr)()); 
1

と書いてください。関数のパラメータ名は、関数を宣言するときに関数名と同じ場所に移動する必要があります。関数宣言を取る

関数宣言:

void func(); // correct syntax 
void() func; // incorrrect syntax 

関数ポインタの宣言:あなたは、次のトリックを使用している場合

void (*func_ptr)(); // correct syntax 
void (*)() func_ptr; // incorrect syntax 

関数ポインタの宣言が容易になります。無名バージョンを使用する場合は、関数名を(*pointerName)、または(*)に置き換えます。

例:

int func1(char* parm1);  // function 
int (*func1_ptr)(char* parm1); // function pointer 

// function taking a function pointer as parameter: 
void foo(int (*func1_ptr)(char*)); 
// The same declaration with an unnamed parameter: 
void foo(int (*)(char*)); 
+0

私は "右 - 左"ルールを使用してあなたのバージョンを読んで、あなたは正しいです。私は私のバージョンを読んで...失われた。私は私の答えからそれを削除しました。 –

2

言語規格の正式な定義がそう言うので、それは違法です。それはその方法であり、それは本当にあいまいに見えるかもしれません理由については、ここにある:The New C Standard: An Economic and Cultural Commentary (v 1.2 from June 24, 2009, section 6.7 Declarations)から

この構文の意図は 視覚的に同じを持っている識別子の宣言子のためにありますその識別子のインスタンスとしての外観を 式に追加します。たとえば、in:

int x [3]、* y、z(void);

char(* f(int))[];

識別子xは、ソースでは添字 の配列として、yは参照されないポインタとして、zは関数呼び出しとして現れることがあります。 fの呼び出しの結果を使用する式の例は、 (* f(42))[1]です。The Development of the C Language by Dennis M. Ritchieから

と同じ:

したがって、

int型I、*パイ、** PPI;

整数へのポインタ、整数へのポインタへのポインタ を宣言します。これらの宣言の構文は、i、* pi、および** ppiが式で使用された場合、int型 を生成するという観測結果を反映しています。同様に、

int f()、* f()、(* f)();

宣言 整数を返す関数、 へのポインタを返す関数、整数を返す関数へのポインタ。

int * api [10]、(* pai)[10];

整数へのポインタの配列を宣言し、 へのポインタを整数の配列として宣言します。これらのすべてのケースでは、変数 の宣言は、その型が宣言の先頭である で指定された型の式に似ています。

+0

これはかなり有益です – bharath

関連する問題