1、 头文件
- 所有头文件要能够自给自足(封装的足够完美),用户和重构工具不用为特定的场合包含额外的头文件
- 所有的头文件都应该有#define保护来阻止头文件被多重包含,命名格式当是:
H - 尽量使用包含头文件的形式,而不是用前置声明的形式
- 内联那些包含循环或 switch 语句的函数常常是得不偿失 (除非在大多数情况下, 这些循环或 switch 语句从不被执行).(猜测的原因是包含循环和switch的通常超过10行代码)
- #include的路径及顺序按照(当前文件头文件、C系统文件、C++系统文件、其它库的.h文件、本项目的.h文件),将当前文件头文件放在第一位的目的是保证维护这些文件的人们首先看到构建中止的消息而不是维护其他包的人们。
2、 作用域 - 命名空间
1) 遵守 命名空间命名 中的规则(命名时考虑路径是一个不错的选择)
2) 在命名空间的最后注释出命名空间的名字
3) 不要使用using 引入整个命名空间的标识符号,这样容易造成命名空间污染
4) 用命名空间把文件包含,在.cc文件中,不需要将自己定义.h文件包含在命名空间中
5) 禁止用内联命名空间(匿名命名空间中的变量只有在当前文件可以访问,当然这不是禁用内联命名空间的原因,只是记录匿名命名空间的特性) - 静态变量
函数和变量可以经由声明为 static 拥有内部链接性,这意味着你在这个文件中声明的这些标识符都不能在另一个文件中被访问。即使两个文件声明了完全一样名字的标识符,它们所指向的实体实际上是完全不同的。(static 会将全局变量的作用域改成仅文件中可见) - 函数
尽量将非成员函数放到命名空间中,而不推荐直接使用裸的全局函数或者将该函数放到一个类中,并将其声明为静态成员函数。
3、 类 - 构造函数尽量使用explicit关键字修饰,这样的好处是,不允许隐式类型转换,类型转换最好借助cast进行转换
- 仅当只有数据成员时使用 struct, 其它一概使用 class.
- 将 所有 数据成员声明为 private, 除非是 static const 类型成员
- 类定义一般应以 public: 开始, 后跟 protected:, 最后是 private:
- 为避免拷贝构造函数, 赋值操作的滥用和编译器自动生成, 可将其声明为 private 且无需实现
4、 函数 - 尽可能编写简短的函数,提高复用性
- 尽量多使用const进行限制参数,其实不只是参数,像返回值,成员函数也是这样
- 对于虚函数, 不允许使用缺省参数, 因为在虚函数中缺省参数不一定能正常工作,虚函数中尽量不要使用默认参数是因为默认参数的解析是在编译期间完成的,而虚函数的调用是在运行时确定的。这两者之间的冲突可能会导致出现意外的结果。
- 可以使用 cpplint.py 检查风格错误,Arch Linux 用户注意了, AUR 有对 cpplint 打包.
5、 命名规则 - 函数命名, 变量命名, 文件命名要有描述性; 少用缩写。总而言之就是一看名字就知道是做什么的(让没有参与开发的程序员知道)
- 文件名要全部小写, 可以包含下划线 () 或连字符 (-), 依照项目的约定. 如果没有约定, 那么 “” 更好
- 所有类型命名 —— 类, 结构体, 类型定义 (typedef), 枚举, 类型模板参数 —— 均使用相同约定, 即以大写字母开始, 每个单词首字母均大写, 不包含下划线
- 变量 (包括函数参数) 和数据成员(private)名一律小写, 单词之间用下划线连接. 类的成员变量以下划线结尾, 但结构体的就不用(用struct声明的)
- 声明为 constexpr 或 const 的变量, 或在程序运行期间其值始终保持不变的, 命名时以 “k” 开头, 大小写混合, const int kDaysInAWeek = 7;
- 常规函数使用大小写混合, 取值和设值函数则要求与变量名匹配,my_exciting_member_variable(),这个是取值函数,没有加get,直接数据成员名字,其实加上问题也不大,看个人习惯, set_my_exciting_member_variable()
- 命名空间以小写字母命名. 最高级命名空间的名字取决于项目名称. 要注意避免嵌套命名空间的名字之间和常见的顶级命名空间的名字之间发生冲突。首先养成一个项目至少有一个最高级命名空间的习惯
- 枚举的命名应当和 常量一致: kEnumName
- 宏的命名应当写成这样:MY_MACRO_THAT_SCARES_SMALL_CHILDREN
6、 注释 - 使用 // 或 /* */, 统一就好,先养成在适当的地方加注释的习惯(程序员最烦的两件事,一个是自己写注释,另一个是别人不写注释,先做到自己写注释吧,哈哈哈)
7、 行长度 - 一行代码的长度不要超过120个字符