为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
慕村9548890 2019-09-20 14:45:03
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;}此示例代码执行我打算执行的操作,即在进入main()应该是程序“开始” 的函数之前打印从0到9的整数平方。我还用-pedantic选项GCC 4.5.0 编译它。它没有错误,甚至没有警告!所以我的问题是,这段代码真的符合标准吗?如果它符合标准,那么它是否会使标准所说的无效?main()不是这个计划的开始!user_main()在执行之前执行main()。我知道要初始化全局变量main_ret,use_main()首先执行,但这是完全不同的事情; 关键是,它确实使标准中的引用语句$ 3.6.1 / 1无效,因为main()它不是程序的开始 ; 事实上,这个计划已经结束了!编辑:你如何定义'开始'这个词?它归结为“程序开始”这一短语的定义。那么你究竟如何定义呢?
查看完整描述

3 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

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

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

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


查看完整回答
反对 回复 2019-09-20
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

你正在错误地阅读这句话。

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

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

您的计划符合要求。在main启动之前,您的程序尚未“启动”。根据标准中“start”的定义,在程序“启动”之前调用构造函数,但这几乎不重要。代码很多被执行前main不断调用每一个程序,不只是这个例子。

出于讨论的目的,您的构造函数代码在程序的“开始”之前执行,并且完全符合标准。


查看完整回答
反对 回复 2019-09-20
?
慕容森

TA贡献1853条经验 获得超18个赞

除非有主程序,否则您的程序将不会链接,因此不会运行。但是main()不会导致程序执行的开始,因为文件级别的对象具有预先运行的构造函数,并且可以在main()到达之前编写一个运行其生命周期的整个程序,并让main本身具有一个空的身体。


实际上要强制执行此操作,您必须拥有一个在main及其构造函数之前构造的对象来调用程序的所有流程。


看这个:


class Foo

{

public:

   Foo();


 // other stuff

};


Foo foo;


int main()

{

}

你的程序流程将有效地源于 Foo::Foo()


查看完整回答
反对 回复 2019-09-20
  • 3 回答
  • 0 关注
  • 404 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信