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_retuse_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()

链接地址: http://www.djcxy.com/p/15139.html

上一篇: Is main() really start of a C++ program?

下一篇: c++ compiling problem