编写高质量代码:改善C++程序的150个建议(连载1)

发表于:2012-3-31 09:45

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:李健    来源:51Testing软件测试网采编

  第1章 从C继承而来的

  C和C++可以说是所有编程语言中关系最为紧密的两个。在目标上,C++被定位为“a better C”;在名称上,C++有一个乳名叫做“C with classes”;在语法上,C更是C++的一个子集,C++几乎支持C语言的全部功能。如果采用C++的方法来描述,以下方式恰如其分:

  1. class C{};  
  2. class CPlusPlus :public C {};

  C++继承自C。

  正是这种难以割舍的紧密联系使得C/C++程序员必须对C有所重视。所以,本章就从C++的前身—C语言说起。

  在开始这段学习旅程前,先分享一个只有程序员才明白的幽默:

  有一次,她开玩笑似地问他:“我在你心里排第几?”他回头微笑着摸了摸她的头,用手指比划了个鸭蛋。她知道他在开玩笑,打了他一巴掌,尽管有些郁闷,但还是尽量避免流露出失望的神色。其实,因为她是文科生,所以她并不知道:在程序员的眼中,所有的数组、列表、容器的下标都是从0开始的。

  所以,我们的建议也从0开始。

  建议0:不要让main函数返回void

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

  然而在编写C++程序入口函数main的时候,很多程序员,特别是一些具有C基础的C++ 程序员时经常会写出如下格式的main函数:

  1. void main()   
  2. {  
  3.     // some code ...  
  4. }

  上述代码在VC++中是可以正确编译、链接、执行的。编译信息如下所示:

  1. 1>------ 已启动生成: 项目: MainCpp, 配置: Debug Win32 ------  
  2. 1>  main.cpp  
  3. 1>  MainCpp.vcxproj -> G:\MainCpp\Debug\MainCpp.exe 
  4. ========== 生成: 成功1 个,失败 0 个,最新 0 个,跳过 0 个==========

  但是当你将代码放在Linux环境下,采用GCC编译器进行编译时,你会吃惊地发现编译器抛出了如下的错误信息:

  1. [develop@localhost ~]  g++ main.cpp  
  2. main.cpp:2: 错误 :'::main'必须返回'int'

  为什么同样的代码会出现两种不同的结果呢?这还是跨平台的C/C++语言吗?不要对C/C++的跨平台性产生质疑,之所以会这样,很大程度上要归结于市面上一些书的“误导”,以及微软对VC++编译器main返回值问题的过分纵容。

  在C和C++中,不接收任何参数也不返回任何信息的函数原型为“void f(void);”。所以很多人认为,不需要程序返回值时可以把main函数定义成void main(void),然而这种想法是非常错误的!

  有一点你必须明确:在C/C++标准中从来没有定义过void main()这样的代码形式。C++之父 Bjarne Stroustrup 在他的主页FAQ 中明确地写着这样一句话:

  在C++中绝对没有出现过void main(){/* ... */}这样的函数定义,在C语言中也是。

  main 函数的返回值应该定义为int 类型,在C和 C++ 标准中都是这样规定的。在C99 标准中规定,只有以下两种定义方式是正确的:

  1. int main( void )  
  2. int main( int argc, char *argv[] )

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

  1. int main()  
  2. int main( int argc, char *argv[] )

  虽然在C和C++标准中并不支持void main(),但在部分编译器中void main()依旧是可以通过编译并执行的,比如微软的VC++。由于微软产品的市场占有率与影响力很大,因此在某种程度上加剧了这种不良习惯的蔓延。不过,并非所有的编译器都支持 void main(),gcc就站在了VC++的对立面,它是这一不良习气的坚定抵制者,它会在编译时就明确地给出一个错误。

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号