2010-12-13 150 views
5

我不明白,为什么下面的声明被接受:为什么括号在函数指针声明中很重要?

typedef void (*_tStandardDeclaration)(LPVOID); 

而下面没有:

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

我使用MSVC6(我知道这是过时的,非标准的,但需要保持每年10万的收入系统:/)

+4

请注意,所有这些typedef声明是有效的。无无效C++。 – 2010-12-13 02:51:46

回答

11

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

5

没有括号,你声明的函数返回void*,而不是指向返回void的函数的指针。

3

下面没有维特通过GCC 4.2.1在MacOS X 10.6.5与编译器设定为模糊接受的代码:

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

代码:

typedef void *LPVOID; 

typedef void (*_tStandardDeclaration)(LPVOID); 

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

第一给出了一个指向函数的指针返回void;后两者是等价的(间距没有区别)并给你一个类型,它是'返回指向void'的函数(取LPVOID参数)。

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

​​

乐趣,是不是...