c++代码规范
总体原则 | 类和函数设计指导原则、保证静态类型安全、保证内存安全、遵循C++ISO标准、优先编译时检查错误、在编译时无法实施的检查,在运行时检查、使用命名空间来限定作用域、优先使用C++特性而不是c特性,并且优先使用标准库 | |
---|---|---|
静态类型安全 | 静态安全类型设计是指在编程语言的静态类型系统中使用类型来确保代码的安全性和正确性。它强调在编译时发现并捕捉潜在的类型错误,从而减少在运行时出现错误的可能性。 | |
保证内存安全 | 内存访问错误包括:1、内存越界访问 2、释放以后继续访问内存 3、解引用空指针 4、内存没有初始化 5、把指向局部变量的引用或者指针传递到了函数外部或者其他线程中 内存泄漏:1、申请的内存或者资源没有及时释放 | |
内核风格-蛇形风格 | 单词全小写,下划线分割 | |
常量 | 本条款中的常量指的是以constexpr 或const 修饰的,其值在程序生命周期内固定不变的对象。 当常量采用全大写,下划线分割的命名风格时,需要注意避免和宏的名字冲突。因为在编译代码时,如果宏的名字与常量名字相同,会将常量替换为宏的内容。 | |
命名空间、类型、函数的命名使用大驼峰命名风格 | ||
函数命名一般采用动词或者动宾结构。 | ||
单词缩写应当作单个单词处理,以提升可读性。 | ||
注释相关 | 当函数遵循某接口约定且存在未使用参数时,可通过如下方式注释掉未使用参数,注释写在类型的右边并且与类型之间至少留有1个空格。被注释掉的参数名应当和声明中的参数名一致。 | |
头文件注释包含版权 | 2012 是文件首次创建年份,而 2018 是文件最后修改年份。 我看trafficLight工程代码源文件也加了版权声明 | |
TODO相关 | TODO/TBD 注释一般用来描述已知待改进、待补充的修改点。 FIXME 注释一般用来描述已知缺陷。 | |
建议使用空格进行缩进,每次缩进为 4 个空格。避免使用制表符(‘\t’)进行缩进。 当前几乎所有的集成开发环境(IDE)和代码编辑器都支持配置将Tab键自动扩展为 4 空格输入。 | ||
对于输入参数,拷贝代价小的类型传值,拷贝代价大的类型传const引用 | ||
unique_ptr不能被复制,只能被移动,并且移动代价小, | ||
设计函数时,优先使用返回值而不是输出参数,返回多个值时,优先使用返回类型为struct或std::tuple | ||
函数参数应尽量避免使用 void* 类型,让编译器在编译时就检查出类型不匹配的问题: 在基于接口编程时,使用基类的引用或指针来作为函数参数 在使用泛型编程时,使用模板 T& 或 T* 来匹配不同类型的参数 | ||
成员变量优先使用声明时初始化或者构造函数初始化列表初始化 | ||
abs用法 | abs函数是取差值,或者是绝对值。参数不能是无符号类型(因为参数是无符号类型相减还是正数,而且还会减翻)。所以abs的参数(两个值计算差值),如果是无符号类型一定要转成有符号类型。 | |
std::round | round、ceil、floor几个函数都是取整。参数类型一定是floor或者double,因为如果参数是整型,比如取平均值,整型除以2结果还是整数。就不存在小数进行四舍五入了。所以需要转换成浮点型数据类型。方式1:uint_32 A = 12; float result = statis_cast(A) / 2; 方式1:uint_32 A = 12; float result = A / 2.0f; | |
整形数据类型减翻问题 | 比如需求为判断一个值A是否比值B大5。代码为uint32_t A = 5; uint32_t B = 7; if (A - B > 5) { std::cout << “A > B” << std::endl; } else { std::cout << “A < B” << std::endl; }。打印结果为"A>B"。错误原因在于整型减翻。这边需要修改成有符号类型相减。方式:if (static_cast(A) - static_cast(B) > 5),打印结果为"A<B"。方式二:if (A > B + 5) 也能实现效果 | |
代码注释 | 准确、与代码一致 |