C++ 标准中的 $3.6.1⁄1 部分内容如下:
程序应包含一个名为 main 的全局函数,它是程序的指定 开始。
现在考虑这段代码,
int square(int i) { return i*i; }
int user_main()
{
for ( int i = 0 ; i < 10 ; ++i )
std::cout << square(i) << endl;
return 0;
}
int main_ret= user_main();
int main()
{
return main_ret;
}
这个示例代码做了我打算做的事情,即打印从 0 到 9 的整数的平方, 然后 进入应该是程序“开始”的 main()
函数。
我还使用 -pedantic
选项编译它,GCC 4.5.0。它没有错误,甚至没有警告!
所以我的问题是,
这段代码真的符合标准吗?
如果它符合标准,那么它不会使标准所说的无效吗? main()
不是这个程序的开始! user_main()
在 main()
之前执行。
我知道要初始化全局变量 main_ret
, use_main()
首先执行,但这完全是另一回事;关键是,它 确实 使标准中引用的语句 $3.6.1⁄1 无效,因为 main()
不是程序的 _开始_;这实际上是 这个 程序的 结束!
编辑:
你如何定义“开始”这个词?
它归结为 “程序开始” 这个短语的定义。那么具体怎么定义呢?
原文由 Nawaz 发布,翻译遵循 CC BY-SA 4.0 许可协议
不,C++ 在调用 main 之前做了很多事情来“设置环境”;但是,main 是 C++ 程序的“用户指定”部分的正式开始。
一些环境设置是不可控的(比如设置 std::cout 的初始代码;但是,一些环境是可控的,比如静态全局块(用于初始化静态全局变量)。请注意,因为你没有完整的在 main 之前控制,您无法完全控制静态块初始化的顺序。
在 main 之后,您的代码在概念上是“完全控制”程序的,因为您既可以指定要执行的指令,也可以指定执行它们的顺序。多线程可以重新排列代码执行顺序;但是,您仍然可以控制 C++,因为您指定了(可能)乱序执行代码部分。