我个人写一些小的项目时,总结的一套自己用的C++编程规范。
命名规范
变量命名规范
变量命名要求字母为小写。
变量命名格式为[前缀_](变量名)[_后缀]
其中,方括号[]
表示可选,变量名每个单词以下划线_
分隔。
注意:begin_
表示begin
为一个前缀,_end
表示end
为一个后缀。表示变量范围的前缀与表示变量类型的前缀可以组合,并把表示变量范围的前缀放到左边;例如一个类成员变量指针可以写为int mp_value;
,前缀m_
放在前缀p_
左边。
表示变量范围的前缀:
前缀/后缀 | 代表的含义 | 举例 |
---|---|---|
g_ | 全局变量(global) | const int g_images_number; |
m_ | 类成员变量(member) | int m_value // 因为类成员变量经常与局部变量重名,所以加个m以区分 |
t_ | 表示这是函数的形参(the) | void func(int t_value); // 因为形参经常与局部变量重名,所以加个t以区分 |
无前缀 | 表示这是局部变量 | int value); |
表示变量类型的前缀:
前缀/后缀 | 代表的含义 | 举例 |
---|---|---|
p_ | 指针(pointer) | float *p_value; |
pd_ | 指向显存的指针(pointer device) | float *pd_value; |
v_ | 数组(vector) | vector<int> v_values; // |
is_ | bool类型 | bool is_empty; // 顾名思义,is_empty == ture时代表为空 |
下面可选:
前缀/后缀 | 代表的含义 | 举例 |
---|---|---|
_ | 后缀为下划线_表示这是一个类内的私有变量 | int m_value_ |
c_ | 常量(const) | const int c_images_number |
类定义
一般来说每个类单独一个文件,
前缀/后缀 | 代表的含义 | 举例 |
---|---|---|
_Interface | 表示这是接口类(纯虚类) | class cCamera_Interface{}; // 注意是类名加c,而不是类变量名加c |
c_ | 类的名称都要以小写字母“c”开头,不需要下划线 ,后跟一个或多个单词。为便于界定,每个单词的首字母要大写。例如:cAnalyzer | class cCameraModel{}; // 注意是类名加c,而不是类变量名加c |
函数命名
函数名以大写字母开头,每个单词首字母大写,没有下划线
void SetQuackBehavior(cQuackBehavior *tp_quack_behavior)
文件命名
- 对于类文件,类文件与类同名,用前缀小写c表示这是个类文件。一个类对应一个源文件和头文件 。
- C源文件用
.c
作为后缀 - C头文件用
.h
作为后缀 - C++源文件用
.cpp
作为后缀 - C++头文件用
.hpp
作为后缀 - cuda源文件用
.cu
作为后缀 - cuda头文件用
.cuh
作为后缀
宏定义
- 宏命名为全部大写,用下划线分隔不同单词。例如:
#define IMAGE_NUMBER
宏表达式
需要加括号,防止加减法优先级低于乘除法导致表达式计算错误。宏的参数
需要加括号,防止用户传的宏参数为加法表达式而导致出错。举例如下:#define IMAGE_RESERVE 3ULL // ULL后缀表示该常量为unsigned long long类型 #define IMAGE_NUMBER (2+IMAGE_RESERVE) // 若表达式不加括号(),由于加减法优先级低于乘除法,那么IMAGE_BUFFER的计算就会出错 #define IMAGE_SIZE 1920*1080 #define IMAGE_BUFFER_SIZE IMAGE_SIZE*3ULL*IMAGE_NUMBER #define IMAGE_BUFFER_ADDRESS (char*)p_buffer // #define IMAGE_BUFFER_ADDRESS(i) (IMAGE_BUFFER_ADDRESS + IMAGE_BUFFER_SIZE * (i)) //对于i也要加括号,因为用户传进来的i可能是一个加法表达式,例如i为3+2,这时如果不加括号就会出错。
- [可选] 可定义几个空的宏,指示函数形参是输入还是输出
#define IN(x) x #define OUT(x) x #define INOUT(x) x
TODO:编程规范
相关/参考链接
- 《google编程规范》