以下代码不起作用。
#include<iostream>
class Application
{
public:
static int main(int argc, char** argv)
{
std::cin.get();
}
};
我认为静态成员函数与普通函数一样,静态WinMain工作正常。为什么不静态主要工作?
好吧,我觉得我有点开始明白了,谢谢你的所有答案。答案 0 :(得分:6)
仅仅因为标准如此说明(3.6.1):
程序应包含一个名为
main
的全局函数。 [...]该功能不应过载。
你拥有的是一个有效的功能,但它不是程序入口点。
答案 1 :(得分:1)
这是由于编译程序的链接如何。基本上,由于范围,它无法找到main
。
C++ standard详细说明为什么在“3.6 - 启动和终止[basic.start]”部分中不能有静态主体,具体为“3.6.1 - 主函数[basic.start.main] ”。在哪里说
所有实现都应允许以下两个主要定义:
int main() { /* ... */ }
和
int main(int argc, char* argv[]) { /* ... */ }
标准的pdf为here。它位于pdf的第69页。
如果你想让你的代码工作,你需要做一些事情,比如
class Application
{
public:
static int main(int argc, char** argv)
{
std::cin.get();
}
};
int main(int argc, char** argv)
{
return Application::main(argc, argv);
}
答案 2 :(得分:1)
下面的代码可以正常工作(虽然没有任何好处,我可以从头脑中思考)
#include<iostream>
class Application
{
public:
static int main(int argc, char** argv)
{
std::cin.get();
return 0;
}
};
int main(int argc, char** argv)
{
return Application::main(argc, argv);
}
另请注意,原始帖子中的main
功能不 main - 其名称为Application::main
,与全局main
完全不同{ {1}} - 您的编译器期望一个名为 main 的函数存在于全局作用域中,而不是存在于类或名称空间中。
答案 3 :(得分:0)
在您的代码中,静态成员main()
存在于类的范围内,只要您不希望它成为程序的入口点(或开头),就可以了。 / p>
标准要求在全局命名空间中定义入口点(即标准 main()
)。所以你可以这样做:
int main(int argc, char** argv) //defined in the global namespace
{
return Application::main(argc, argv);
}
答案 4 :(得分:0)
假设您有两个类Application1
和Application2
,两个类都带有名为main
的公共静态函数,并带有相应的签名。哪一个应该被选中?所以这毫无意义。
C ++标准定义了自由函数 main
(有2个可能的签名,如果我没记错的话 - argc / argv且没有参数)作为程序的入口点。实现可以自由添加(例如WinMain)。所以基本上,静态类函数根本没有被定义为标准中的入口点。
您当然可以将全局main
函数的参数转发给您选择的任何内部主函数。