抛开具体的编译器,抛开具体的操作系统。
C/C++程序总是要一个调用入口,一般来说,这个入口就是main 。这样就有几个问题:
1、谁来调用这个入口?
一般来说,并不是操作系统直接调用,而是由操作系统提供的一段初始化代码来调用这个入口函数。这段代码由编译器在连接时放入可执行程序中,操作系统在载入程序后,执行这段初始化代码,然后,从这段代码调用 main 。因此,我们在连接时将程序的入口变为其他的函数是完全可以的。这也是为什么 Windows 应用程序的入口函数是 WinMain 的原因(当然又它的必要,入口函数的参数和一般的 main 不一样)。
2、一个程序的入口只有一个,也只能有一个。那么象楼上的朋友提到的,全局变量由谁来进行初始化?
一般来说是由 main 来进行初始化。在 main 函数中编译器会将各个模块全局变量的初始化代码放入其中(或者调用一个初始化函数)。但这并不是绝对的。编译器完全可以在调用 main 之前再加上一些代码,进行额外的初始化工作,这些工作往往和具体的编译器/连接起始相关的,不一定具有普遍性。
3、对于程序员来说,程序究竟是从哪儿开始执行的呢?
在决大多数情况来说,程序是从连接器决定的程序的主函数开始的。主函数不一定是 main ,也可能是其他的什么名字。在主函数开始之前,某些编译器也许会允许程序员加上自己的一些初始化代码,但这并没有普遍意义,而且也是不推荐的(对操作系统及编译器的初始化过程相当熟悉而且确实有必要的时候才会这样做)。