c++ - main() 真的是 C++ 程序的开始吗?

标签 c++ standards-compliance program-entry-point entry-point

C++ 标准中的 $3.6.1/1 部分写道,

A program shall contain a global function called main, which is the designated start of the program.

现在考虑这段代码,

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() 不是 start该程序;它实际上是这个程序的结束!


编辑:

你如何定义“开始”这个词?

归结为短语“程序开始”的定义。那么具体是怎么定义的呢?

最佳答案

你读错了句子。

A program shall contain a global function called main, which is the designated start of the program.

该标准为该标准的其余部分定义了“开始”一词。它并不是说在调用 main 之前没有代码执行。它说程序的开始被认为是在函数 main.

您的程序合规。在 main 启动之前,您的程序还没有“启动”。根据标准中“开始”的定义,在您的程序“开始”之前调用该函数,但这并不重要。在每个程序中曾经调用 main 之前,都会执行很多代码,而不仅仅是这个例子。

出于讨论的目的,您的函数在程序“启动”之前执行,这完全符合标准。

关于c++ - main() 真的是 C++ 程序的开始吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4783404/

相关文章:

释放 * 时 C++ 内存泄漏?

cross-browser - CSS 中的渐变

java - eclipse 错误 "Could not find or load main class"

c - (size_t)((char *)0) 的计算结果是否为 0?

c - 理解C逻辑printf和贵重元素

java - 什么是 ~ 运算符

c++ - 函数参数名称的范围

c++ - 外部数组定义

c++ - (如何)我可以使用 openmp 对 `std::complex<double>` 进行矢量化吗?

html - &lt;!DOCTYPE html> 和旧版浏览器