在课堂上定义主要功能

时间:2014-05-09 07:38:48

标签: c++ main friend

我想知道是否可以在类中定义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中定义了! 这里发生了什么?

3 个答案:

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