为什么静态主要不在C ++中工作?

时间:2012-04-14 16:01:06

标签: c++

以下代码不起作用。

#include<iostream>
class Application
{
public:
    static int main(int argc, char** argv)
    {
        std::cin.get();
    }
};

我认为静态成员函数与普通函数一样,静态WinMain工作正常。为什么不静态主要工作?

好吧,我觉得我有点开始明白了,谢谢你的所有答案。

5 个答案:

答案 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)

假设您有两个类Application1Application2,两个类都带有名为main的公共静态函数,并带有相应的签名。哪一个应该被选中?所以这毫无意义。

C ++标准定义了自由函数 main(有2个可能的签名,如果我没记错的话 - argc / argv且没有参数)作为程序的入口点。实现可以自由添加(例如WinMain)。所以基本上,静态类函数根本没有被定义为标准中的入口点。

您当然可以将全局main函数的参数转发给您选择的任何内部主函数。