关于main函数

来源:互联网 发布:淘宝店一般能赚多少钱 编辑:程序博客网 时间:2024/05/01 20:07

main函数是个什么鬼?提到main函数大家一定不陌生。可是最近看书的时候,发现对它了解甚少。因此在这里做一些总结。

C语言基本组成单位是函数,既然是一个一个函数组成了一个完整的程序。那么程序的执行总要有个入口吧,因此呢,就规定了main函数作为程序执行的入口函数。

关于main函数原型,C++标准特别规定了main函数的原型:

int main() {/*........*/}和int main(int argc,char *argc[]){/*.......*/}

        这两种应该是最具代表性也是最具有可移植性的(比如在windows,Linux下这种写法在哪个编译器下应该都不会出错),第一个无参数,第二个可以通过命令行传参数。当然还有其他形式的,比如经常见得void main(){}以及vs平台下的int _tmain(int argc, _TCHAR* argv[]){}(该种形式在codeblocks编译器就会出错,应该还和编译器有关)。

main()既然是函数,那么就存在返回值的问题。可以返回0,也可以返回非0值。返回0值表示程序正常结束,返回非0值表示错误或者非正常退出。

实际上执行完main函数以后,main函数的返回值传给了exit(int)函数(x系统默认调用)作为其实参。比如程序正常结束,那么它的返回值就是0,此时就会调用exit(0)作为返回操作系统的代码,来指示程序执行的结果。在stdlib.h头文件中,有如下宏定义作为exit()的实参。

#define EXIT_SUCCESS    0
#define EXIT_FAILURE    1

从宏定义可以看出,main函数正常结束返回0,然后传给exit(0),即表示正常退出。

如果我们想提前结束程序的执行,可以在其他函数中调用exit()来结束程序。

特别的,C++标准对main有几个不同于一般函数的限制:

(1)不能重载(重载了还怎么知道那是个入口函数)

(2)不能内联(不知道为什么)

(3)不能定义为静态的(不懂)。

(4)不能取地址(不懂)

(5)不能由用户自己调用(那岂不是要陷入无限循环中)

之前有个师兄面试,面试官问到这样一道题,如何在main函数执行前,打印一串字符。如果你了解程序编译过程和对象的内存分配,那么你就会知道怎么做。

全局变量的初始化是在main函数执行前,假如我们定义一个自定义全局变量,比如test类对象td,那么初始化td必然会调用其构造函数,我们在它的构造函数中定义打印命令即可。如下所示:

</pre><pre name="code" class="cpp">#include "stdafx.h"#include <iostream>using namespace std;class test{public:test(){cout << "print before main" << endl;}};test td;int _tmain(int argc, _TCHAR* argv[]){cout << "print main" << endl;system("pause");return 0;}
结果:





0 0