C语言main函数返回值类型支持哪些?
main函数的返回值,用于说明程序的退出状态。 return返回的数值由程序的作者自定。返回不同的值可以代表不同的含义,一般是代表出错的原因。如果返回0,则代表程序正常退出;返回其它数字的含义则由系统决定。通常,返回非零代表程序异常退出。
C语言有两个宏,它定义在 stdlib.h 中。顺便提一哈,也许聪明厉害的你早就知道了。
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
默认EXIT_SUCCESS 为成功返回, EXIT_FAILURE 为出错返回,相当于调用abort()函数。
下面分别说一下 C 和 C++ 标准中对 main 函数的定义。
在 C89 中,main( ) 是可以接受的。Brian W. Kernighan 和 Dennis M. Ritchie 的经典巨著 The C
programming Language 2e(《C 程序设计语言第二版》)用的就是 main( )。不过在最新的 C99 标准中,只有以下两种定义方式是正确的:
int main( void )
int main( int argc, char *argv[] )
如果不需要从命令行中获取参数,请用int main(void) ;否则请用int main( int argc, char *argv[] )。 main 函数的返回值类型必须是 int ,这样返回值才能传递给程序的激活者(如操作系统),等同于 exit(0)。
如果 main 函数的最后没有写 return 语句的话,C99 规定编译器要自动在生成的目标文件中(如 exe 文件)加入return 0;,表示程序正常退出。不过,建议你最好在main函数的最后加上return语句,虽然没有这个必要,但这是一个好的习惯。注意,vc6不会在目标文件中加入return 0; ,大概是因为 vc6 是 98年的产品,所以才不支持这个特性。不过,gcc3.2(Linux 下的 C编译器)会在生成的目标文件中加入 return 0。
C++98 中定义了如下两种 main 函数的定义方式:
int main( )
int main( int argc, char *argv[] )
int main( ) 等同于 C99 中的 int main( void ) ;int main( int argc, char*argv[] ) 的用法也和C99 中定义的一样。同样,main函数的返回值类型也必须是int。如果main函数的末尾没写return语句,C++98 规定编译器要自动在生成的目标文件中加入 return 0; 。同样,vc6 也不支持这个特性,但是 g++3.2(Linux 下的 C++编译器)支持。
现在我们来做一个小试验来观察main()函数的返回值。
注意:本系列我都在Mac下开发演示,但适用于unix/linux系统。如果在Windows系统有不一样的表现时,我会指明。
编写如下代码并编译运行:
//a.c
#include “stdio.h”
int main(void)
{
printf(“I love you.”);
return 0;
}
将这个文件保存为a.c,编译运行后会生成一个a.out文件。现在打开命令提示符,在命令行里运行刚才编译好的可执行文件,然后输入 echo $? ,回车,就可以看到程序返回 一个0 。如果把 return 0; 改为 return 110; ,那么很显然,再次执行上述步骤以后你可以看到程序返回110。要是你这样写 return 110.01; 那还是返回110,因为110.01被传给操作系统之前,被强制类型转换成整数类型了。
现在,我们把a.c改回原来的代码,然后再编写另一个程序b.c:
//b.c
#include “stdio.h”
int main(void)
{
printf(“\nI’m too.”);
return 0;
}
编译运行后打开命令提示符,在命令行里输入a&&b 回车,这样你就可以看到《人鬼情未了》里面经典的爱情对白:
I love you.
I’m too.
&& 的含义是:如果 && 前面的程序正常退出,则继续执行 && 后面的程序,否则不执行。所以,要是把a.c里面的 return 0; 删除或者改为 return 99; ,那么你只能看到 I love you. 。也就是说,程序b.c就不执行了。现在,大家该明白 return 0; 的作用了吧。
总结
1.main函数的返回值为int,请牢记在心。用于说明程序的退出状态。如果返回0,则代表程序正常退出;返回其它数字的含义则由系统决定。通常,返回非零代表程序异常退出。
2.无论在任何平台做C语言开发,main函数最后一行代码请留给return 0;