在类中定义main函数

Define main function in class

本文关键字:main 函数 定义      更新时间:2023-10-16

我想知道是否有可能在类中定义main(),例如:

struct runtime_entry_point
{
    friend int main()
    {
    }
};

我已经测试过了,它不工作(几乎在GCC 4.8.2中):

g++ -o dist/Release/GNU-Linux-x86/turbo build/Release/GNU-Linux-x86/main.o/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/../../../../lib/crt1.o:函数' _start': collect2: error: ld exit with status 1

这听起来像是没有定义的main()错误

后来,我用经典的方式写了main:
struct runtime_entry_point
{
    friend int main()
    {
    }
};
int main(){}

现在编译失败了,因为int main()已经在结构体runtime_entry_point中定义了!这里发生了什么?

通常不可能将main写入类/结构体的一部分。默认情况下,链接器搜索一个免费的main方法并针对它进行链接,使其成为入口点。您可以在链接器级别更改此行为,在这种情况下,main必须是类/结构中的静态方法。但这是依赖于链接器实现的,不可移植的,而且很危险。

然而,在你提到的第二种情况下,是违反一个定义规则的结果。您在一个翻译单元中定义了一个名称(main())不止一次。

Аccording对于cppreference.com上的文章,采用以下结构:

struct runtime_entry_point
{
    friend int main()
    {
    }
};

定义了一个非成员函数,同时使其成为该类的友元。这样的非成员函数总是内联的。

链接器无法在目标文件(内联函数)中找到main(),并且您不能在相同的翻译单元中声明另一个main()(因为它已经声明过)。

你不能定义函数两次,当你将定义更改为类/结构内部的声明时,它可以工作:

#include <iostream>
struct runtime_entry_point
{
    friend int main();
};
int main()
{
    std::cout << "Hello, world!" << std::endl;
}