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的整数平方,这个函数应该是程序的“开始”。
看看这里的输出:http://www.ideone.com/Niy0R
我还用-pedantic
选项GCC 4.5.0编译了它。 它没有错误,甚至没有警告!
所以我的问题是,
这个代码真的符合标准吗?
如果它符合标准,那么它是不是使标准所说的无效? main()
不是这个程序的开始! user_main()
在main()
之前执行。
我明白要初始化全局变量main_ret
, use_main()
首先执行,但完全不同; 问题在于,它确实使标准中引用的语句$ 3.6.1 / 1无效,因为main()
不是程序的开始; 它实际上是这个计划的结束 !
编辑:
你如何定义“开始”这个词?
它归结为短语“程序开始”的定义。 那么你究竟如何定义它呢?
不,在调用main之前,C ++做了很多事情来“设置环境”。 然而,main是C ++程序的“用户指定”部分的正式开始。
有些环境设置是不可控制的(就像设置std :: cout的初始代码一样;但是,某些环境可以像静态全局块一样控制(用于初始化静态全局变量)。请注意,由于您没有满在main之前的控制权,您不能完全控制静态块初始化的顺序。
在main之后,你的代码在概念上是“完全控制”程序的,因为你可以指定要执行的指令和执行它们的顺序。 多线程可以重新排列代码执行顺序; 但是,由于您指定了部分代码执行(可能)不按顺序,因此您仍然使用C ++控制。
您正在阅读错误的句子。
程序应包含一个名为main的全局函数,它是程序的指定开始。
该标准是为了该标准的其余部分的目的而定义“开始”一词。 它没有说在调用main
之前没有代码执行。 它说,该计划的开始被认为是main
的功能。
您的程序符合标准。 在main启动之前,你的程序还没有“开始”。 根据标准中“start”的定义,在程序“启动”之前调用构造函数,但这并不重要。 在每个程序中调用main
之前执行很多代码,而不仅仅是这个例子。
为了讨论的目的,您的构造函数代码在程序“开始”之前执行,并且完全符合标准。
除非有主系统,否则您的程序将不会链接,因此无法运行。 然而,main()不会导致程序执行的开始,因为在文件级别的对象具有事先运行的构造函数,并且可能编写一个完整的程序,它在达到main()之前运行其生命周期并让main本身具有一个空的身体。
实际上,为了强制执行此操作,必须在main和其构造函数之前构造一个对象,以调用该程序的所有流。
看这个:
class Foo
{
public:
Foo();
// other stuff
};
Foo foo;
int main()
{
}
你的程序的流程将有效地源自Foo::Foo()