cpp编码规范要求
1、所有头文件使用#ifndef #define #endif来防止文件被多重包含,命名格式当是:
<PROJECT>_<PATH>_<FILE>_H_
2、只有当函数只有10行甚至更少时才将其定义为内联函数。内联函数必须放在.h文件中。
3、鼓励使用匿名命名空间,以避免运行时的命名冲突,不要在.h文件中使用匿名命名空间。
4、局部变量
允许在任何位置声明变量,提倡在尽可能小的作用域中 变量,离第一次使用越近越好。应使用初始化的方式替代声明再赋值。
好的声明方式:
Int j = g();
Vector<int> v = {1, 3};
5、所有按引用传递的参数必须加上const
6、不允许使用变长数组和alloca()。应使用更安全的分配器,像std::vector或std::unique_ptr<T[]>.
7、允许合理地使用友元类及友元函数。
8、不使用C++异常。
9、禁止使用RTTI
10、 使用c++的类型转换,如static_cast<>()。不要使用int y = (int)x等方式。
11、 只在记录日志时使用流
12、 使用c++11的constexpr来定义真正的常量,或实现常量初始化。
13、 C++内建整型中,仅使用int。如果程序中需要使用不同大小的变量,可以使用<stdint.h>中长度精确的整型,如int16_t.
头文件stdint.h中定义了int16_t,uint32_t,int64_t等整型,在合适的情况下,推荐使用标准类型如size_t和ptrdiff_t。
14、 尽可能使用sizeof(变量名)代替sizeof(类型)。因为代码中的变量类型改变时会自动更新。
15、 Auto只能用在局部变量里,别用在文件作用域变量,命名空间作用域变量和类数据成员里。永远别列表初始化auto变量。
16、 命名约定。
l 通用命名规则
函数命名、变量命名、文件命名要有描述性。少用缩写
l 文件命名
文件名要全部小写,可以包含下划线”_”或连字符“”“-”,依照项目的约定。如果没有约定,那么“_”更好。
C++文件要以.cpp结尾,头文件以.h结尾,专门插入文本的文件则以.inc结尾。不要使用已存在于/usr/include下的文件名。
查找和系统头文件重名方法:
Find /usr/include |grep –i ‘要取得名字.h’
l 类型命名
类型名称的每个单词首字母均大写,不包含下划线。所有类型命名,包括类、结构体、类型定义(typedef)、枚举和类型模板参数,均使用相同约定,即以大写字母开始,每个单词首字母均大写,不包含下划线,例如:
class UrlTable{……}
class UrlTableTester{……}
struct UrlTableProperties{}
typedef hash_map<UrlTableProperties *, string> PropertiesMap;
l 变量命名
变量(包括函数参数)和数据成员名一律小写,单词之间使用下划线连接。类的成员变量以下划线结尾,但结构体的不用。
l 常量命名
声明为constexpr或const的变量,或在程序运行期间其值始终保持不变的,命名时以”k”开头,大小写混合。
例如:
const int kDaysInAWeek = 7;
l 函数命名
常规函数使用大小写混合,取值和设值函数则要求与变量名匹配。
一般来说,函数名的每个单词首字母大写(即“驼峰变量名”),没有下划线,对于首字母缩写的单词,更倾向于将它们视为一个单词进行首字母大写,如写作StartRpc()而非StartRPC()。
同样的命名规则适用于类作用域与命名空间作用域的常量。
l 命名空间命名
命名空间以小写字母命名,最高级命名空间的名字取决于项目名称。
l 枚举命名
枚举的命名应与常量一致:kEnumName
17、 注释
类注释:每个类的定义都要附带一份注释,描述类的功能和用法,除非他的功能相当明显。
函数注释:函数声明处的注释描述函数功能,定义处的注释描述函数实现。
18、 使用空格(每次缩进2个空格)而不使用制表符。应该讲制表符设置为2个空格。
19、 返回类型和函数名在同一行,参数也尽量放在同一行。换行后的参数保持4个空格的缩进。
20、 Lambda表达式
若用引用捕获,在变量名和&之间不留空格。
21、 指针和引用表达式
句点或箭头前后不要有空格。指针或地址操作符(*,&)之后不要有空格。在声明指针变量或参数时,*与类型或变量名紧挨都可以。不允许在多重声明中使用&或*。
22、 访问控制块的声明依次是public:,protected:,private:,每个都缩进1个空格。
23、 构造函数初始值列表:放在同一行或者按4个空格缩进并排多行。
24、 命名空间内容不缩进。
25、 水平留白的使用根据在代码中的位置决定。永远不要在行尾添加没意义的留白。
If条件语句和循环语句关键字后均有空格。
赋值运算符等二元运算符前后总是有空格。
尖括号不与空格紧邻,<前没有空格,>和(之间也没有。
如:vector<string> x;
y = static_cast<char *>(x)
26、 垂直留白
不在万不得已,不使用空行,尤其是在两个函数定义之间的空行不要超过两行。函数体首尾不要留空行,函数体中也不要随意添加空行。