8

我不明白为什么下面的声明被接受:

typedef void    (*_tStandardDeclaration)(LPVOID);

而以下没有:

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

我正在使用 MSVC6(我知道它已经过时且不标准,但需要它来维持每年一千万的收入系统:/)

4

3 回答 3

15

指针符号默认绑定到类型,所以函数指针需要括号来表示指针实际上是在名称上而不是在返回类型上。

于 2010-12-13T02:43:51.373 回答
8

没有括号,您声明的是一个返回 a 的函数void*,而不是一个指向返回的函数的指针void

于 2010-12-13T02:45:39.240 回答
4

下面的代码在 MacOS X 10.6.5 上被 GCC 4.2.1 接受,编译器设置为 fussy:

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

代码:

typedef void *LPVOID;

typedef void    (*_tStandardDeclaration)(LPVOID);

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

第一个给出一个返回函数的指针void;后两者是等效的(间距没有区别),并为您提供一种类型,即“返回指向 void 的指针的函数(采用 LPVOID 参数)”。

您可以使用它们来声明函数指针:

typedef _tDeclarationWithoutParenthesis *_tFunctionPointer;

好玩是不是...

于 2010-12-13T02:53:04.777 回答