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