我正在研究MS C ++编译器,并完成了下一个程序:
#include <stdio.h>
void main(void)
{
void(*ptr)(void) = &main;
}
我想在main()方法/函数上创建一个指针,但是出现了下一个错误:
error C2440: 'initializing' : cannot convert from 'int (__cdecl *)(void)' to 'void (__cdecl *)(void)'
This conversion requires a reinterpret_cast, a C-style cast or function-style cast
我想知道:
答案 0 :(得分:4)
以下是获取指向main
函数的指针的方法:
#define DECLARE_UNUSED( name ) (void) name; struct name
int main()
{
int(*ptr)() = &main;
DECLARE_UNUSED( ptr ); // Prevents using `ptr`.
// Don't use `ptr` here. In particular, don't call.
}
请注意
main
必须包含结果类型int
。
调用main
(例如通过该指针)会导致未定义的行为。
没有必要从main
返回任何内容;默认返回值为0.
正如您所看到的,main
是一个非常特殊的功能。
这些规则(通常)不适用于其他功能。
另请注意,在不诊断void
结果类型时,Visual C ++是错误的。
最后,请注意,编写非标准void
比标准int
更多地输入一个字符,即,它只是一个非常非常愚蠢的事情。 ; - )
PS:Visual C ++可能可能关于int main
的事情,因为它(可能)在内部将void main
翻译为int main
,可能它会这样做事物与非智能链接器链接,同时积极支持void main
,例如微软自己的文档中的非标准示例将进行编译。无论如何,这是我的理论#1,因为你问。但它当然是纯粹的猜测,也许甚至那些编码起来的人也不清楚为什么(理论#2)。
答案 1 :(得分:2)