1

下面的代码不起作用。

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

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

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

4

5 回答 5

6

Simply because the standard says so (3.6.1):

A program shall contain a global function called main. [...] The function shall not be overloaded.

What you have is a valid function, but it's not the program entry point.

于 2012-04-14T16:14:55.713 回答
1

这是由于编译程序上的链接方式。main基本上,由于范围,它无法找到。

C++ 标准详细说明了为什么在“3.6 - 启动和终止 [basic.start]”部分,特别是“3.6.1 - 主函数 [basic.start.main]”中不能有静态 main。它说的地方

所有实现都应允许以下两种 main 定义:

    int main() { /* ... */ }

    int main(int argc, char* argv[]) { /* ... */ }

该标准的 pdf 文件在这里。它在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);
}
于 2012-04-14T16:04:26.913 回答
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- 您的编译器期望一个名为main的函数存在于全局范围内,而不是存在于类或命名空间内。

于 2012-04-14T16:07:41.137 回答
0

在您的代码中,静态成员main()存在于类的范围内,只要您不希望它成为程序的入口点(或开始)就可以了。

该标准要求在全局命名空间中定义入口点(即标准)。 main()所以你可以这样做:

int main(int argc, char** argv) //defined in the global namespace
{
    return Application::main(argc, argv);
}
于 2012-04-14T16:07:21.847 回答
0

假设您有两个类,Application1并且Application2都具有称为 的公共静态函数main,并具有适当的签名。应该选哪一个?所以这没有任何意义。

The C++ standard defines the free function main (with 2 possible signatures, if I remember correctly - argc/argv and no arguments) as the entry point to the program. Implementations are free to add their own (e.g. WinMain). So basically, static class functions are simply not defined to be entry points in the standard.

You are of course free to forward your global main function's arguments to whatever internal main function you choose.

于 2012-04-14T16:10:56.370 回答