我想知道是否可以在类中定义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退出状态1
这听起来好像没有main()
错误的定义。
后来,我用经典的方式写了主要内容:
struct runtime_entry_point
{
friend int main()
{
}
};
int main(){}
现在编译失败了,因为int main()
已经在结构runtime_entry_point
中定义了! 这里发生了什么?
答案 0 :(得分:4)
通常不可能将main
写为类/结构的一部分。默认情况下,链接器会搜索一个免费的main
方法并链接它,使其成为入口点。您可能通过链接器级别改变此行为,在这种情况下,main
必须是类/结构中的静态方法。但这是依赖于链接器的实现,不便携且危险。
但是,在您提到的第二种情况下,违反了One Definition Rule。您在一个翻译单元中多次定义名称(main()
)。
答案 1 :(得分:2)
根据cppreference.com上的article,以下结构:
struct runtime_entry_point
{
friend int main()
{
}
};
定义非成员函数,并同时使其成为此类的朋友。这种非成员函数始终是内联的。
链接器在目标文件(内联函数)中找不到main(),并且您不能在同一个翻译单元中声明另一个main()(就像它已经声明的那样)。
答案 2 :(得分:0)
您不能定义两次函数,当您将定义更改为类/结构内的声明时,它会起作用:
#include <iostream>
struct runtime_entry_point
{
friend int main();
};
int main()
{
std::cout << "Hello, world!" << std::endl;
}
这与GCC一起使用just fine。