【发布时间】:2015-04-13 14:34:09
【问题描述】:
如果我将 main 定义为对函数的引用会怎样?
#include<iostream>
#include<cstring>
using namespace std;
int main1()
{
cout << "Hello World from main1 function!" << endl;
return 0;
}
int (&main)() = main1;
会发生什么?我在在线编译器中测试了错误“分段错误”:
而且在 VC++ 2013 下会造成程序在运行时崩溃!
将函数指针的数据作为代码调用的代码将被编译,该代码将在启动时立即崩溃。
我还想要一份关于此的 ISO C++ 标准引用。
如果您想根据类似这样的宏定义 2 个入口点中的任何一个,该概念将非常有用:
int main1();
int main2();
#ifdef _0_ENTRY
int (&main)() = main1;
#else
int (&main)() = main2;
#endif
【问题讨论】:
-
我认为您要求很高,希望 ISO 标准能够解决这种疯狂的行为。
-
有趣的是,该标准实际上并没有禁止在独立实现中构建的代码定义一个名为
main的全局符号,它不是一个函数,尽管它确实在该符号上施加了其他保留命名空间。 -
@ChristianHackl 该标准已经跨越 1300 页。如果它必须详细说明程序员想做的每一件疯狂的事情,那么没人会阅读它。
-
@remyabel:事实上,正如问题的答案所示,标准确实定义了是否允许OP的代码。它必须;根据定义,该标准涵盖了所有可以想象的代码,并告诉您它是否有效。 IWO,无论多么疯狂,标准中没有一段代码“我不在乎这是否是未定义的行为”。
-
@remyabel:它在 [basic.start.main]/3 中这么说。 “函数
main不得在程序中使用。”这包括使用它来初始化引用。 (这与问题无关,即main被允许成为什么样的实体。)
标签: c++ reference main language-lawyer iso