8

以下の宣言が受け入れられる理由がわかりません。

typedef void    (*_tStandardDeclaration)(LPVOID);

次はそうではありませんが:

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

私は MSVC6 を使用しています (時代遅れで非標準であることはわかっていますが、年間 1,000 万の収益システムを維持するために必要です :/ )

4

3 に答える 3

15

ポインター記号はデフォルトで型にバインドされるため、関数ポインターには、ポインターが実際には戻り値の型ではなく名前にあることを示す括弧が必要です。

于 2010-12-13T02:43:51.373 に答える
8

かっこがなければ、 を返すvoid*関数へのポインタではなく、 を返す関数を宣言していますvoid

于 2010-12-13T02:45:39.240 に答える
4

以下のコードは、コンパイラが fussy に設定されている MacOS X 10.6.5 上の GCC 4.2.1 によって、ウィッターなしで受け入れられます。

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

コード:

typedef void *LPVOID;

typedef void    (*_tStandardDeclaration)(LPVOID);

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

最初のものは、 を返す関数へのポインターを与えますvoid。後者の 2 つは同等であり (間隔に違いはありません)、「void へのポインターを返す関数 (LPVOID 引数を取る)」という型を提供します。

それらを使用して、関数ポインターを宣言できます。

typedef _tDeclarationWithoutParenthesis *_tFunctionPointer;

楽しいですね...

于 2010-12-13T02:53:04.777 に答える