main函数
一、简介
main函数 ,又称 主函数 ,作为绝大部分 C程序唯一的入口 ,是要求有返回值的,该返回值返回给(如操作系统)来表明该程序的执行状况。 返回0代表程序正常执行成功,返回非0值代表程序异常结束 ,因此返回值需要是int整型,于是有了int main()的规范。
如果使用void main(),即声明主函数没有返回值,程序虽能编译、运行成功,却不利于程序的激活者判断其状态,这对于有很多C程序构成的大型项目来说是可能是致命的。
尤其从C99标准(1999年制定的官方C语言标准第二版)开始必须使用int main(),如果没有加return 0;语言,C99要求编译器自动添加(自己写上是个好习惯)。只声明main()的话,系统默认为int main()。void main()无论何时都不应该使用,因为主函数必须有返回值表明程序的运行状态(在代码中不使用void main()是一个良好的习惯)。
二、定义
在最新的C99标准中,只有以下两种定义方式是正确的:
int main(void)
int main(int argc, char *argv[]) // char *argv[]可以写成char **argv
1. 参数
- void:不接受任何参数;
- argc:代表程序所运行环境传递给程序的参数数量;
- argv:指向argc+1个指针的数组的首元素的指针。数组末元素为空指针,而若前面有元素,则它们指向表示从宿主环境传递给程序的参数的字符串。若argv[0]不是空指针(或argc>0),则它指向表示程序名的字符串。若程序名从宿主环境不可用则该字符串为空。
2. 返回值
返回值会用作隐式调用exit()的参数,值0和EXIT_SUCCESS指示成功终止,值非0和EXIT_FAILURE指示不成功终止。
EXIT_SUCCESS,EXIT_FAILURE,定义于头文件<stdlib.h>:
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
EXIT_SUCCESS和EXIT_FAILURE宏展开能用作exit参数的整数表达式(从而作为从main函数返回的值),并指示程序执行状态。EXIT_SUCCESS表示程序执行成功,EXIT_FAILURE表示程序执行不成功。
三、误区
很多人甚至市面上的一些书籍,都使用了void main(),其实这是错误的。C/C++中从来没有定义过void main()。 C++之父Bjarne Stroustrup在他的主页上的FAQ中明确地写着“The definition void main() {/*...*/}is not and never has been C++,nor has it even been C.”(void main()从来就不存在与C++或者C)。
在C和C++中,不接受任何参数也不返回任何信息的函数原型为“void foo(void)”。可能正是因为这个,所以很多人都误认为如果不需要程序返回值时可以把main函数定义成void main(void)或void main()。然而这是错误的!main函数的返回值应该定义为int类型,C和C++标准中都是这样定义规定的。虽然在一些编译器中,void main()可以通过编译,但并非所有编译器都支持void main(),因为标准中从来没有定义过void main。g++3.2、dev C++等环境中如果main函数的返回值不是int类型,根本无法通过编译。而gcc3.2则会发出警告。所以,如果你想你的程序拥有很好的可移植性, 请一定要用int main() 。