实用经验 49 不要让main返回void

C++标准规定main函数的返回类型必须为int,voidmain()是不合法的。虽然某些编译器如VC++支持voidmain(),但在GCC中会报错。main函数的返回值用于指示程序执行状态,0表示正常结束,非0表示异常。不遵循标准可能导致移植性问题。因此,应避免使用voidmain(),并确保在main函数末尾显式返回0以确保兼容性和清晰的程序逻辑。
摘要由CSDN通过智能技术生成

同C程序一样,每个C++程序都包含一个或多个函数,且必须有一个函数其名称为main,而且每个函数都要一定功能的语句序列组成。程序执行时,操作系统通过程序入口main函数,调用main函数开始程序的运行,程序执行完毕后返回一个值给操作系统。在大多数系统中,main函数的返回值说明程序的退出状态。如果main函数返回0,则代表main函数成功执行完毕,程序正常退出,否则代表程序异常退出。

然而有些C++的编程人员,特别那些有C基础的C++程序员经常会写出如下格式的main函数:

void main()
{
	// some codes….
    return;
}

在简述上述代码存在问题之前,我们首先看一下上述代码在VC++和GCC两种编译器中的编译运行情况。

在VC++2010编译器可正常编译,连接和执行。编译信息如下所示:

1>------ 已启动生成: 项目: main, 配置: Debug Win32 ------
1>生成启动时间为 2012/11/30 21:23:25。
1>InitializeBuildStatus:
1>  正在对“Debug\main.unsuccessfulbuild”执行 Touch 任务。
1>ClCompile:
1>  所有输出均为最新。
1>  main.cpp
1>  main.vcxproj -> C:\Users\liuguang\Documents\Visual Studio 2010\Projects\main\Debug\main.exe
1>
1>生成成功。
1>
1>已用时间 00:00:02.84
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

Linux环境下,采用GCC编译器编译main.cpp文件。编译信息如下所示:

root@ubuntu:/home/liuguang# g++ main.cpp -o main
main.cpp:2: error: `main' must return `int'

可以看出同样的main.cpp程序在VC++中可以正常编译,在Linux下GCC中无法编译通过。为什么同样的代码会出现两种不同的结果呢?难道C++程序不能在Windows和Linux下跨平台运行了。请不要质疑C++的跨平台属性。

有一点你必须明白:在C/C++标准中从来就没定义过void main()这样的main函数形式。定义void main()这种形式的main函数是不符合C++标准的。

说明C++之父Bjarne Stroustrup在他的主页中写了这么一句话:在C++中绝对没有出现过void main() {/ / }这样的函数定义,在C语言中也是如此。

main函数的返回值应该为int类型,不应该是void或者其他类型。C和C++都是这么规定的。C99标准中规定,只有下面两种main函数定义方式是合法的,正确的。

int main(void);
int main(int argc, char *argv[]);

在C++03标准中也给出了如下两种main函数定义方式:

int main(void);
int main(int argc, char *argv[]);

可以看出虽然C/C++标准中均未定义void main()这种形式的main函数,但是像VC++这种市场占有率这高的编译器还是依然支持的了void main()这种形式。然而并不是所有的编译器都支持这种形式。GCC就是一个例子。

理解了main函数的定义形式,接着看一下main函数的返回值有何作用?可以采用下面的方法加以验证。
首先,编写一个mian.cpp文件,文件内容如下所示:

int main()
{
	return 0;
}

在linux中,通过命令:g++ main.cpp –o main编译可生产main可执行文件。然后执行命令:chmod 777 main添加文件可执行权限,最后执行命令:./main && echo “indicate main retrun 0”输出indicate main retrun 0语句。

修改上述程序:

int main()
{
	return -1;
}

再次执行上述测试,则无输出。

最后在windows上修改上述程序:

void main()
{
	return ;
}

再次运行上述测试,测试结果为输出indicate main retrun 0语句。

可以看出命令A&&B中的&&类似于C++中的并操作。如果A命令正常执行,接着就执行B命令。如果A命令执行出现异常,则B就不执行了。通过上述分析可知:如果main返回0标示程序正常结束,如果main返回-1,则标志着程序未能正常返回。

讲述到这儿基本上可以告一段落了。总结一下void main()形式函数存在的风险隐患。

如果你坚持使用void main()形式的非标准形式main函数。当你的程序有一个编译器移植到另一个编译器时,你要承担错误风险。因为你在一个编译中编写的返回类型为void的main函数移植到另一个编译器时,可能无法编译成功。

有些情况下,main函数的返回值是其他操作的输入值。在这种情况下,返回void更是一个不智之举。无论main函数怎么处理main函数都以正常执行处理。

注解由于C语言历史发展原因,一些老的C标准可以支持main()这种无返回值得函数定义。这是因为在早期的C语言中只有int一种数据类型,不存在char,long,float,double等这些内置类型。既然只有int这样一种类型,所以main就不必表明返回值了。例如:《The C Programming Language, Second Endition》中使用的就是main()。

为了保证C语言兼容以前的代码,标准委员会就做出了如下的规定:不明确返回值的,默认返回int类型。C99则要求对应无返回类型的main至少要抛出一个警告。

最后,说明一下C++中一个“好坏难定”的准则:

C++中的main函数的return语句作用在于离开main函数,并将main函数的返回值作为参数调用exti函数。如果函数的结尾没return语句,其效果等同于return 0。也就是说,如果main函数的执行到结束时没有遇到return语句,编译器会默认隐式地为你添加return 0;,其效果等同于return 0;语句。

为什么说他好坏难定呢。这主要是因为它让你省去手动敲入几个字符的麻烦,但是另外一方面这种快件会让某些程序员忽视编译器替他所做的工作。在思维上形成一种错误的意识:main函数可以无返回值。同时在应用此规则时,你还需注意下面两点:

(1)main函数的返回类型必须为int,并不是void或者其他类型此规则仅仅对main函数适用。

(2)但是本人不推荐大家适用上述规则,建议加上return 0;杜绝那些不必要的误解。

请谨记

  • 在C/C++标准中,main函数的返回类型仅有int这种类型,不存在void或者其他类型。
  • 某些编译器main函数返回void或其他类型,这是不符合C++标准的。即使可以通过编译,也存在很多问题:如可移植性问题。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值