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

新手上路,请多包涵

C++ 标准中的 $3.6.11 部分内容如下:

程序应包含一个名为 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_retuse_main() 首先执行,但这完全是另一回事;关键是,它 确实 使标准中引用的语句 $3.6.11 无效,因为 main() 不是程序的 _开始_;这实际上是 这个 程序的 结束


编辑:

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

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

原文由 Nawaz 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 464
2 个回答

不,C++ 在调用 main 之前做了很多事情来“设置环境”;但是,main 是 C++ 程序的“用户指定”部分的正式开始。

一些环境设置是不可控的(比如设置 std::cout 的初始代码;但是,一些环境是可控的,比如静态全局块(用于初始化静态全局变量)。请注意,因为你没有完整的在 main 之前控制,您无法完全控制静态块初始化的顺序。

在 main 之后,您的代码在概念上是“完全控制”程序的,因为您既可以指定要执行的指令,也可以指定执行它们的顺序。多线程可以重新排列代码执行顺序;但是,您仍然可以控制 C++,因为您指定了(可能)乱序执行代码部分。

原文由 Edwin Buck 发布,翻译遵循 CC BY-SA 2.5 许可协议

你读错了句子。

一个程序应包含一个名为 main 的全局函数, 它是程序的指定开始。

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

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

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

原文由 Adam Davis 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题