为什么括号在函数指针声明中很重要?
我不明白为什么下面的声明被接受:
typedef void (*_tStandardDeclaration)(LPVOID);
而下面的声明不被接受:
typedef void *_tDeclarationWithoutParenthesis(LPVOID);
typedef void* _tAlternateDeclaration(LPVOID);
我正在使用MSVC6(我知道它已经过时且不标准,但需要它来维持每年千万级的收入系统:/)
I don't understand why the declaration below is accepted:
typedef void (*_tStandardDeclaration)(LPVOID);
while the following doesn't:
typedef void *_tDeclarationWithoutParenthesis(LPVOID);
typedef void* _tAlternateDeclaration(LPVOID);
I am using MSVC6 (I know it's obsolete and non-standard, but it's needed to maintain a yearly tenth-million revenue system :/ )
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
默认情况下,指针符号绑定到类型,因此函数指针需要括号来指示指针实际上位于名称上,而不是返回类型上。
The pointer symbol binds to the type by default, so the function pointer needs the parenthesis to indicate that the pointer is actually on the name and not on the return type.
如果没有括号,您将声明一个返回
void*
的函数,而不是指向返回void
的函数的指针。Without the parentheses, you're declaring a function returning a
void*
, not a pointer to a function returningvoid
.下面的代码在编译器设置为 fussy 的情况下被 MacOS X 10.6.5 上的 GCC 4.2.1 毫不犹豫地接受:
代码:
第一个给出一个指向返回
void
的函数的指针;后两者是等效的(空格没有区别),并为您提供一个类型“返回指向 void 的指针的函数(采用 LPVOID 参数)”。您可以使用它们来声明函数指针:
很有趣,不是吗...
The code below is accepted without a witter by GCC 4.2.1 on MacOS X 10.6.5 with the compiler set to fussy:
Code:
The first gives a pointer to a function returning
void
; the latter two are equivalent (spacing makes no difference) and give you a type that is 'function (taking LPVOID argument) that returns pointer to void'.You can use them to declare function pointers:
Fun, isn't it...