2013-08-27 14 views
8

typedef int (xxx)(int yyy);は、整数パラメータyyyを持つ関数を指すxxxという名前の関数ポインタを定義しているようです。「typedef int(xxx)(int yyy);」を理解する方法?

しかし、私はその構文を理解することはできません...いずれか良い説明を与えることができますか?私はtypedef int xxx(int yyy);を見つける


はまだ動作します。両者の違いは?

+1

[この説明](http://c-faq.com/decl/spiral.anderson.html)が役立つ場合があります。 – icktoofay

+0

'*'、 'typedef int(* xxx)(int yyy);は関数ポインタを定義しています –

+0

@AlterMannいいえ、それは私のコードではありません。私はそれが関数のポインタを定義すると思うが、私は考えていないようだ。 – Sayakiss

答えて

15

これは、関数型を定義するものであり、関数型の型を定義するものではありません。

typedefのパターンは、オブジェクトを宣言するのではなく、オブジェクトが持つ型のエイリアスを宣言するように宣言を変更することです。

これは完全に有効です。特に

typedef int (xxx)(int yyy); // Note, yyy is just an unused identifier. 
// The parens around xxx are also optional and unused. 

xxx func; // Declare a function 

int func(int arg) { // Define the function 
    return arg; 
} 

CおよびC++言語、および幸い、関数定義の全体タイプとしてtypedef名前の使用を禁止します。

+1

すばらしい説明!この関数がどのように呼び出されるかを示すことは役に立ちます。たとえば、関数呼び出しで 'typedef'という名前を使うことができるかどうかです。 – verbose

+3

@verboseこの関数は他の関数と同じように呼び出されます。 typedef名の存在は何にも影響しません。それが通話にどのように適用できるかわからない。 – Potatoswatter

+0

この関数型を使用して、わかりやすくするために示した例のように関数ポインタを定義できます。 –

0

はい、typedef int (xxx)(int yyy);は、機能タイプを定義するtypedef int xxx(int yyy);と同じです。例は156ページC 11の標準ドラフトN1570から見つけることができます。そのページからの引用、

All three of the following declarations of the signal function specify exactly the same type, the first without making use of any typedef names.

typedef void fv(int), (*pfv)(int); 
    void (*signal(int, void (*)(int)))(int); 
    fv *signal(int, fv *); 
    pfv signal(int, pfv); 
0

あなたが宣言T xでいくつかの宣言子xを持っている場合は、その後、T x(t1 p1, t2 p2)は宣言子xが前に持っていたのと同じ型を返す、のparams P1、P2との機能を意味し、 。

宣言子の前後の括弧は、の括弧の中に最初に修飾子を適用します。

あなたのケースでは、括弧の中に修飾語はありません。これは、その中に必要がないことを意味します。

関数プロトタイプの意味この署名を持つ関数があり、その名前はBlahです。

typedef関数のプロトタイプを使用する方法関数名に名前をつけます。これは、この署名を持つ関数が存在することを意味するものではありません。この名前はタイプとして使用できます。例:

typedef int xxx(int yyy); 

xxx *func_ptr;  // Declaration of a variable that is a pointer to a function. 
xxx *func2(int p1); // Function that returns a pointer to a function. 
+0

'T x'は宣言になり、' x'は宣言子になります。 – Potatoswatter

+0

そうですね、私はこれを考えていましたが、私の文章は良くありませんでした。私は更新します。 –

関連する問題