【问题标题】:Define main function in class [duplicate]在类中定义主函数[重复]
【发布时间】:2014-06-26 20:48:56
【问题描述】:

我想知道是否可以在类中定义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 exited with status 1

在我看来,这听起来像是没有定义 main() 错误

后来,我用经典的方式写了main:

struct runtime_entry_point
{
    friend int main()
    {

    }
};

int main(){}

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

【问题讨论】:

  • 无论你在做什么:不要这样做。
  • @MilesRout 我只是出于好奇。但是如果你不想知道上下文,我正在做模板元编程,我正在寻找一种方法来自动生成main(),这在 tmp 元程序中通常什么都不做。
  • 所有人注意:我不是问在结构中定义main() 是否是一个好习惯,我问的是上述情况的原因(main() 不是在结构中定义与之前的定义)
  • 有办法,移民Java。
  • 您可以找到here 昨天关于模板化main 的讨论,这使得它成为isocpp 选择的最近问题。如果您通读 Jefffrey 的答案的 cmets,则会对与 main 相关的 c++ 内在函数进行彻底解释。但我想你已经知道这篇文章了

标签: c++ main friend


【解决方案1】:

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

但是,您提到的第二种情况是违反One Definition Rule的结果。您在一个翻译单元中多次定义了一个名称 (main())。

【讨论】:

    【解决方案2】:

    根据 cppreference.com 上的article,以下构造:

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

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

    链接器在目标文件(内联函数)中找不到 main(),并且您不能在同一个翻译单元中声明另一个 main()(正如它已经声明的那样)。

    【讨论】:

      【解决方案3】:

      您不能两次定义一个函数,当您将定义更改为类/结构内的声明时,它会起作用:

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

      这适用于just fine 与 GCC。

      【讨论】:

        猜你喜欢
        • 2015-05-02
        • 1970-01-01
        • 2019-01-16
        • 1970-01-01
        • 1970-01-01
        • 2020-05-06
        • 1970-01-01
        • 1970-01-01
        • 2012-11-11
        相关资源
        最近更新 更多