从刚刚开始学习C/C++程序设计的时候就知道main()函数是程序的入口,对于教材上的格式化描述int main(int argc, char *argv[])也是总是从来不问为什么的简写为 int main();现在使用linux环境编程才有机会知道了其中一点点早就该知道的秘密:main()的参数问题。
由于main函数不能被其他的函数调用,因此main函数的参数不可能在程序的内部取得实际值的。实际上main函数的参数值是从操作系统命令行中获取的。当运行一个可执行文件时,在linux命令行下键入文件名,在输入实际参数即可把这些参数传送给main的形参中去。
命令行的一般形式为:
可执行文件名 参数 参数 ...........
应该特别注意的是,main的两个形参和命令行中的参数在位置上不是一一对应的,因为main的形参只有两个,而命令行中的参数个数原则上未加限制。argc参数表示了命令行中的参数个数(注意:可执行文件名本身也是一个参数),argc的值也是在输入命令行时由系统按照实际参数的个数自动赋予的。例如有命令行为:
gcc -o a.out a.c
由于文件名gcc本身也算是一个参数,所以上述的命令行中一共有四个参数,因此argc取得值为4。而argv参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按照字符串处理)的首地址。指针数组的长度就是参数argc的值。数组元素初值由系统自动赋予。在上面的命令中argv数组第一个元素指向的字符串为“gcc”,第二个元素指向的字符串为“-o”,第三个元素指向的字符串为“a.out”,第四个元素指向的字符串为“a.c”.
此外main函数返回类型一般都是int,返回值传递给程序的激活者(如操作系统),如果main函数的最后没有写return 语句的话,gcc会自动在生成的目标文件中加入:
return 0;
表示程序正常的退出。