我想知道是否有可能在类中定义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()
错误。
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;
}