为什么括号在函数指针声明中很重要?

时间:2010-12-13 02:41:53

标签: c++ function-pointers typedef function-declaration

我不明白为什么接受以下声明:

typedef void    (*_tStandardDeclaration)(LPVOID);

而以下情况不是:

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

我正在使用MSVC6(我知道它已过时且非标准,但需要保持每年十亿的收入系统:/)

3 个答案:

答案 0 :(得分:12)

默认情况下,指针符号绑定到类型,因此函数指针需要括号来指示指针实际上在名称上而不是返回类型。

答案 1 :(得分:6)

如果没有括号,则表示函数返回void*,而不是指向返回void的函数的指针。

答案 2 :(得分:4)

下面的代码在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的函数的指针;后两个是等价的(间隔没有区别),并给你一个类型''函数(采用LPVOID参数),返回指向void'的指针。

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

typedef _tDeclarationWithoutParenthesis *_tFunctionPointer;

有趣,不是吗......