2013-08-27 8 views
8

typedef int (xxx)(int yyy); zdaje się definiować wskaźnik funkcji o nazwie xxx, który wskazuje na funkcję o parametrze całkowitym yyy.Jak rozumieć "typedef int (xxx) (int yyy);"?

Ale nie rozumiem tej składni ... Czy ktokolwiek mógłby podać dobre wyjaśnienie?


Znajduję typedef int xxx(int yyy); nadal działa. Jakaś różnica między nimi?

+1

Pomocne może być [to wyjaśnienie] (http://c-faq.com/decl/spiral.anderson.html). – icktoofay

+0

Tęsknisz za '*', 'typedef int (* xxx) (int yyy);' definiuje wskaźnik funkcji –

+0

@AlterMann Nie, to nie jest mój kod. Myślę, że definiuje wskaźnik funkcji, ale wydaje się nie, nie mam pojęcia .. – Sayakiss

Odpowiedz

15

Definiuje typ funkcji, a nie typ wskaźnika funkcji.

Wzorzec z polega na tym, że modyfikuje każdą deklarację, tak że zamiast deklarować obiekt, deklaruje alias do typu, który miałby obiekt.

To jest całkowicie poprawny:

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 i C++ Języki konkretnie, i na szczęście, nie pozwolić na korzystanie z nazwy typedef jak cały typu w definicji funkcji.

+1

Świetne wyjaśnienie! Pomocne byłoby pokazanie, w jaki sposób wywoływana jest ta funkcja, np. Czy możliwe jest użycie nazwy "typedef" w wywołaniu funkcji. – verbose

+3

@verbose Funkcja jest wywoływana jak każda inna. Istnienie nazwy typedef nie wpływa na nic. Nie wiesz, jak można to zastosować do połączenia. – Potatoswatter

+0

możesz użyć tego typu funkcji do zdefiniowania wskaźnika funkcji, tak jak w przykładzie, który pokazałem, aby poprawić czytelność. –

0

Tak, typedef int (xxx)(int yyy); jest taki sam jak typedef int xxx(int yyy);, który definiuje typ funkcji. Przykład można znaleźć na stronie 156 Standard C15 N1570. Cytat z tej strony,

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

Jeśli masz jakieś declarator x w deklaracji T x, następnie T x(t1 p1, t2 p2) oznacza funkcji z params P1, P2, powrót tego samego typu jak declarator x został mający przed .

Nawias wokół deklaratora oznacza zastosować modyfikatory wewnątrz nawiasu najpierw.

W twoim przypadku nie ma żadnych modyfikatorów wewnątrz nawiasów. Oznacza to, że nie ma w nich potrzeby.

Prototyp funkcji oznacza Istnieje funkcja, która ma taki podpis i nosi nazwę Blah.

Typedef z prototypem funkcji oznacza Pozwala nadać nazwę bla na funkcję podpis. Nie oznacza to, że istnieje jakakolwiek funkcja z tym podpisem. Ta nazwa może być używana jako typ. Na przykład:

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' będzie deklaracją, a' x' będzie deklaratorem. – Potatoswatter

+0

Tak, myślałem o tym, ale moje pisanie nie było dobre. Zaktualizuję. –