关闭

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

发表于:2012-4-18 09:41

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

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

  建议23:尽量使用C++标准的iostream

  IO是我们最基本的需求之一。比如当我们进入C++世界时所接触的第一个程序HelloWorld,采用printf()或operator<<都可以。所以,我们会有如下的版本:

  1. //Version 1  
  2. #include < stdio.h > 
  3. int main()  
  4. {  
  5.      printf("Hello World");  
  6.      return 0;  
  7. }  
  8. //Version 2  
  9. #include < cstdio > 
  10. int main()  
  11. {  
  12.      std::printf("Hello World");  
  13.      return 0;  
  14. }  
  15. //Version 3  
  16. #include < iostream.h > 
  17. int main()  
  18. {  
  19.      cout<<"Hello World";  
  20.      return 0;  
  21. }  
  22. //Version 4  
  23. #include < iostream > 
  24. using namespace std;  
  25. int main()  
  26. {  
  27.      cout<<"Hello World";  
  28.      return 0;  
  29. }

  stdio.h、cstdio两个头文件中都有printf()的定义,而iostream.h和iostream中也都有operator<<的定义。是stdio.h 还是cstdio?是iostream.h还是iostream?是printf() 还是operator<<?这些都值得思考。

  关于File.h和File,这还得从C++标准库说起。C++标准程序库涵盖范围相当大,包含了许多好用的功能,所以,标准库与第三方提供程序库中的类型名称和函数名称发生名称冲突的可能性大大增加。为了避免这个问题的发生,标准委员会决定让标准库中的内容都披上std的外衣,放在std名空间中。但是这么做同时又带来了一个新的兼容性问题:很多C++程序代码依赖的都是没有用std包装的C++“准”标准库,例如iostream.h等,如果将原有的iostream.h贸然代替掉,那肯定会引起众多程序员的抗议。

  标准化委员会最后决定设计一种新的头文件名来解决这个问题。于是,他们把C++头文件File.h中的.h去掉,将File这样没有后缀的头文件名分配给那些用std包装过的组件使用;而旧有的File.h保持不变,仅仅在标准中声明不再支持它,顺势把问题丢给了广大厂商,堵住了那些老程序员抗议的嘴。同样,对C的头文件也做了相同的处理,在前面加上了一个字母c以示区分。因为C++标准还要遵守“对C兼容”这个契约,备受“歧视”的旧有的C头文件“侥幸存活”了下来。虽然标准化委员会选择抛弃那些旧有的C++头文件,但是各大厂商为了各自的商业利益,却依然选择了对旧有C++头文件的支持。

  因此就出现了类似stdio.h 和cstdio、iostream.h和iostream这样的双胞胎:

  1. // 标准化以前C++中的C标准库,标准C的头文件继续获得支持,这类文件的内容并  
  2. // 未放在std中  
  3. #include<stdio.h> 
  4. // 标准化后经过改造的C的标准库,C的标准库对应的新式C++版本,这类头文件的  
  5. // 内容也有幸穿上了std的外衣  
  6. #include<cstdio> 
  7. // 标准化以前的头文件,这些头文件的内容将不处于namespace std中  
  8. #include<iostream.h> 
  9. // 标准化以后的标准头文件,它提供了和旧有的头文件相同的功能,但它的内容都并  
  10. // 入了namespace std中,从而有效避免了名称污染的问题  
  11. #include<iostream>

  其实标准化以后标准程序库的改动并不只有这些,很多标准化的组件都被模板化了。

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

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号