C++声明'main'作为函数的引用?

AnA*_*ons 8 c++ iso program-entry-point reference language-lawyer

如果我将main定义为函数的引用怎么办?

#include<iostream>
#include<cstring>

using namespace std;

int main1()
{
    cout << "Hello World from main1 function!" << endl;
    return 0;
}

int (&main)() = main1;
Run Code Online (Sandbox Code Playgroud)

会发生什么?我在一个在线编译器中测试了错误"Segmentation fault":

这里

在VC++ 2013下,它将在运行时创建程序崩溃!

将编译将函数指针的数据作为代码调用的代码,该代码将在启动时立即崩溃.

我还想要一个关于这个的ISO C++标准报价.

如果你想根据某些宏定义2个入口点中的任何一个,这个概念会很有用:

int main1();

int main2();

#ifdef _0_ENTRY
int (&main)() = main1;
#else
int (&main)() = main2;
#endif
Run Code Online (Sandbox Code Playgroud)

Ben*_*igt 16

这不是一个符合要求的C++程序.C++要求(第3.6.1节)

程序应包含一个名为的全局函数 main

您的程序包含一个名为的全局非函数main,它引入了与所需main函数的名称冲突.


这样做的一个理由是它允许托管环境在程序启动期间进行函数调用main.它不等同于源字符串main(args),它可以是函数调用,函数指针取消引用,operator()在函数对象上的使用,或构造类型的实例main.不,main必须是一个功能.

另外需要注意的是,C++标准从未说明实际的类型main,并阻止您观察它.因此,实现可以(并且!)重写签名,例如添加int argc, char** argv, char** envp您省略的任何签名.显然它无法知道为你main1和你做这件事main2.


Lig*_*ica 7

如果要根据某些宏定义2个入口点中的任何一个,这将非常有用

不,不是真的.你应该做这个:

int main1();
int main2();

#ifdef _0_ENTRY
   int main() { return main1(); }
#else
   int main() { return main2(); }
#endif
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的,不引人注目的解决方案. (2认同)