C小加

厚德 博学 求真 至善 The bright moon and breeze
posts - 145, comments - 195, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

标准C++的一些约定

Posted on 2011-04-19 22:22 C小加 阅读(3279) 评论(9)  编辑 收藏 引用

1. C++虽然主要是以C的基础发展起来的一门新语言,但她不是C的替代品,不是C的升级,C++和C是兄弟关系。没有谁比谁先进的说法,更重要的一点是C和C++各自的标准委员会是独立的,最新的C++标准是C++03,最新的C标准是C99。因此也没有先学C再说C++的说法,也不再(注意这个"不再")有C++语法是C语法的超集的说法。

  2. C++/CLI 和 C# 是微软的,它们与C和C++没有任何关系,虽然部分语法相似。但哪两种语言不相似呢?都是abc这26个字母。

  3. 不要使用TC/TC++/BC/CB等古老的编译器来学习C/C++,因为它们太古老了,不支持新的C/C++标准。不要使CBX/VC++6.0/VC2005等对C/C++标准支持不好的编译器,虽然这些编译器适合工作,但不适合学习,因为它们中的语法陷阱很多。记住唯一适合学习的编译器是 gcc/mingw。

  4. 不要用""代替<>来包含系统头文件,虽然有些编译器允许你这样做,但它不符合C/C++标准。错误的示例#include "stdio.h",#include "iostream"

  5. 不要将main函数的返回类型定义为void,虽然有些编译器允许你这样做,但它不符合C/C++标准。不要将函数的int返回类型省略不写,在C++中要求编译器至少给一个警告。错误的示例:void main() {},main() {}

  6. 不要把VC++中的 #include "stdafx.h" 贴出来,它是预编译头文件。如同上菜时不要把厨师也放到托盘中。

  7. [C++]不要#include <iostream.h>,不要#include<string.h>,因为它们已经被C++标准明确的废弃了,请改为 #include <iostream> 和 #include < cstring>。

  规则就是:

  a. 如果这个头文件是旧C++特有的,那么去掉.h后缀,并放入std名字空间,比如 iostream.h 变为 iostream。

  b. 如果这个头文件是C也有的,那么去掉.h后缀,增加一个c前缀,比如 string.h 变为 cstring、stdio.h 变为 cstdio, 等等。
BTW:不要把<string.h>、<cstring>、<string>三个头文件搞混淆
BTW:windows.h不是C/C++的标准文件,因此它的命名C/C++不管。

  8. 不要再写 char* p = "XXX" 这种语句,要写成 const char* p = "XXX",编译器之所以让前者通过编译是为了兼容以前的大量的旧代码。
  
  BTW:const TYPE* p 和 TYPE const* p 是一样的,风格不同而已。

  BTW:C语言中也有const关键字。

  9. 不要在同一条语句中包含一个变量的多个++/--,因为它们的解析在C/C++标准中没有规定,完全取决于编译器的个人行为。

  10. C/C++是平台无关性语言,因此系统相关的process/GUI等不在标准C/C++库中。比如 graphics.h和windows.h等是由某个编译器提供的,而不是由C/C++提供的。

  11. C/C++只是语言,而且是平台无关性语言。

  论坛上有部分人甚至认为C就是dos,C++就是windows,那么请问linux是什么?

  12. [C++]面向对象曾经是设计c with class(C++的前身)的主要目的,但C++不是,C++是一个多典范语言。主要支持过程调用、基于对象、面向对象、泛式编程这四种编程典范,当然还支持functional, generative,meta programming等典范。

  13. 语法学家不是文学家,所以当你学会了一门计算机语言时,你还需要学习数据机构和算法,还需要掌握工具和平台API的用法。

  14. C/C++是通用语言,因此语法很复杂,你应当裁减成适合你自己的语法集合,比如裁减成better C和ADT。

  15. C/C++是通用语言,因此只含通用的库,你应该丰富自己需要的库,比如汽车工业协会有自己的C/C++函数/类/模板库


C/C++头文件一览
C、传统 C++

#include <assert.h>    //设定插入点
#include <ctype.h>     //字符处理
#include <errno.h>     //定义错误码
#include <float.h>     //浮点数处理
#include <fstream.h>    //文件输入/输出
#include <iomanip.h>    //参数化输入/输出
#include <iostream.h>   //数据流输入/输出
#include <limits.h>    //定义各种数据类型最值常量
#include <locale.h>    //定义本地化函数
#include <math.h>     //定义数学函数
#include <stdio.h>     //定义输入/输出函数
#include <stdlib.h>    //定义杂项函数及内存分配函数
#include <string.h>    //字符串处理
#include <strstrea.h>   //基于数组的输入/输出
#include <time.h>     //定义关于时间的函数
#include <wchar.h>     //宽字符处理及输入/输出
#include <wctype.h>    //宽字符分类

//////////////////////////////////////////////////////////////////////////

标准 C++ (同上的不再注释)

#include <algorithm>    //STL 通用算法
#include <bitset>     //STL 位集容器
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>     //复数类
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>      //STL 双端队列容器
#include <exception>    //异常处理类
#include <fstream>
#include <functional>   //STL 定义运算函数(代替运算符)
#include <limits>
#include <list>      //STL 线性列表容器
#include <map>       //STL 映射容器
#include <iomanip>
#include <ios>       //基本输入/输出支持
#include <iosfwd>     //输入/输出系统使用的前置声明
#include <iostream>
#include <istream>     //基本输入流
#include <ostream>     //基本输出流
#include <queue>      //STL 队列容器
#include <set>       //STL 集合容器
#include <sstream>     //基于字符串的流
#include <stack>      //STL 堆栈容器    
#include <stdexcept>    //标准异常类
#include <streambuf>    //底层输入/输出支持
#include <string>     //字符串类
#include <utility>     //STL 通用模板类
#include <vector>     //STL 动态数组容器
#include <cwchar>
#include <cwctype>

using namespace std;

//////////////////////////////////////////////////////////////////////////

C99 增加

#include <complex.h>   //复数处理
#include <fenv.h>    //浮点环境
#include <inttypes.h>  //整数格式转换
#include <stdbool.h>   //布尔环境
#include <stdint.h>   //整型环境
#include <tgmath.h>   //通用类型数学宏

Feedback

# re: 标准C++的一些约定  回复  更多评论   

2011-04-19 23:01 by 溪流
1、最新 C++ 标准是 C++03 吧?
4、引号的搜索路径中我记得是当前目录找不到就找include目录,这是标准吧?

# re: 标准C++的一些约定  回复  更多评论   

2011-04-20 02:20 by gbb21
@溪流
同意~

# re: 标准C++的一些约定  回复  更多评论   

2011-04-20 03:37 by 千暮(zblc)
留爪

# re: 标准C++的一些约定  回复  更多评论   

2011-04-20 08:07 by abc881858
不是说好的c++的<string>吗? 怎么用的c的<cstring>?!

# re: 标准C++的一些约定  回复  更多评论   

2011-04-22 16:49 by ylywyn
c++0x@溪流
@溪流

# re: 标准C++的一些约定  回复  更多评论   

2011-04-24 12:33 by C小加
是C++0X。第四条只是区别<>和"",没有解释它们的意思@溪流

# re: 标准C++的一些约定  回复  更多评论   

2011-04-24 12:36 by C小加
@abc881858
C++中的string是个容器,C中的string.h包含的是字符串处理的一些函数,例如strcmp。两个头文件不是一个概念,所以string和cstring是不一样的。

# re: 标准C++的一些约定  回复  更多评论   

2011-04-24 21:24 by 溪流
@C小加
嗯?你要表达什么意思?和C++0x有何关系?

# re: 标准C++的一些约定  回复  更多评论   

2011-04-26 20:33 by waiting4you
记住唯一适合学习的编译器是 gcc/mingw 这句话有点偏激,VC7以后的编译器对标准支持已经很好了。另外,CB也不古老,也有才出炉不久的C++Builder XE。

其它的写得很棒,我想转载,博主有没有意见?^_^

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理