IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 实用经验 49 不要让main返回void -> 正文阅读

[C++知识库]实用经验 49 不要让main返回void

同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++标准的。即使可以通过编译,也存在很多问题:如可移植性问题。
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-25 11:28:13  更:2021-07-25 11:28:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 3:10:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码