猿问

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

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()它不是程序的开始 ; 事实上,这个计划已经结束了!


编辑:


你如何定义'开始'这个词?

它归结为“程序开始”这一短语的定义。那么你究竟如何定义呢?


慕村9548890
浏览 405回答 3
3回答

阿晨1998

不,C ++在调用main之前做了很多事情来“设置环境”;&nbsp;但是,main是C ++程序中“用户指定”部分的正式启动。一些环境设置是不可控的(比如设置std :: cout的初始代码;但是,某些环境可以像静态全局块一样控制(用于初始化静态全局变量)。注意,因为你没有完整在main之前控制,您无法完全控制静态块初始化的顺序。在main之后,您的代码在概念上“完全控制”程序,在某种意义上,您既可以指定要执行的指令,也可以指定执行它们的顺序。多线程可以重新排列代码执行顺序;&nbsp;但是,你仍然可以控制C ++,因为你指定让代码段执行(可能)乱序。

繁华开满天机

你正在错误地阅读这句话。程序应包含一个名为main的全局函数,它是程序的指定开始。该标准是为了标准的其余部分而定义“开始”一词。它并没有说在main调用之前没有代码执行。它说程序的开始被认为是在功能上main。您的计划符合要求。在main启动之前,您的程序尚未“启动”。根据标准中“start”的定义,在程序“启动”之前调用构造函数,但这几乎不重要。代码很多被执行前main被不断调用每一个程序,不只是这个例子。出于讨论的目的,您的构造函数代码在程序的“开始”之前执行,并且完全符合标准。

慕容森

除非有主程序,否则您的程序将不会链接,因此不会运行。但是main()不会导致程序执行的开始,因为文件级别的对象具有预先运行的构造函数,并且可以在main()到达之前编写一个运行其生命周期的整个程序,并让main本身具有一个空的身体。实际上要强制执行此操作,您必须拥有一个在main及其构造函数之前构造的对象来调用程序的所有流程。看这个:class Foo{public:&nbsp; &nbsp;Foo();&nbsp;// other stuff};Foo foo;int main(){}你的程序流程将有效地源于 Foo::Foo()
随时随地看视频慕课网APP
我要回答