2010-12-13 5 views
5

Ich verstehe nicht, warum die Erklärung unten angenommen wird:Warum sind Klammern in der Funktionszeigerdeklaration wichtig?

typedef void (*_tStandardDeclaration)(LPVOID); 

während des folgenden nicht:

typedef void *_tDeclarationWithoutParenthesis(LPVOID); 
typedef void* _tAlternateDeclaration(LPVOID); 

ich MSVC6 bin mit (ich weiß, es ist veraltet und nicht-Standard, aber Es wird benötigt, um ein jährliches 10-Millionen-Umsatzsystem zu verwalten: /)

+4

Beachten Sie, dass diese alle typedef Erklärungen gültig sind. Keine ist ungültig C++. –

Antwort

11

Das Zeigersymbol bindet standardmäßig an den Typ, daher benötigt der Funktionszeiger die Klammer, um anzuzeigen, dass der Zeiger tatsächlich auf dem Namen und nicht auf der Rückgabe steht t Ich.

5

Ohne die Klammern deklarieren Sie eine Funktion, die void* zurückgibt, kein Zeiger auf eine Funktion, die void zurückgibt.

3

Der folgende Code ohne witter von GCC 4.2.1 auf MacOS X 10.6.5 mit dem zu pingelig gesetzt Compiler akzeptiert wird:

c++ -Wall -Wextra -c xx.cpp 

Code:

typedef void *LPVOID; 

typedef void (*_tStandardDeclaration)(LPVOID); 

typedef void *_tDeclarationWithoutParenthesis(LPVOID); 
typedef void* _tAlternateDeclaration(LPVOID); 

Die erste gibt ein Zeiger auf eine Funktion, die zurückgibt; Die letzten beiden sind äquivalent (Abstand macht keinen Unterschied) und gibt Ihnen einen Typ, der "Funktion ist (unter Annahme des LPVOID-Arguments), die Zeiger auf void zurückgibt".

Sie können sie Funktionszeiger erklären:

typedef _tDeclarationWithoutParenthesis *_tFunctionPointer; 

Spaß, nicht es ist ...