代码风格

使用Google C++ 代码风格 风格指南(中文版/英文原版)

C

bsp及下层代码使用纯c编写,头文件使用 #pragma once 防止重复包含。

函数名使用bsp_xx_xx的形式,例如bsp_can_init()

typedef和枚举使用bsp_xx_xx_t的形式,例如bsp_can_t和bsp_can_callback_t

C++

命名空间

尽量使用类进行封装,每一层的类在声明时都必须显示声明其所在的层命名空间。 例如:

YourDeviceName.hpp

namespace Device{
class YourDeviceName{
    YourDeviceName();
};
}

然后再对应的cpp文件开头直接使用此命名空间

YourDeviceName.cpp

#include "YourDeviceName.hpp"

using namespace Device;

YourDeviceName::YourDeviceName(){
    ...
}

命名规范

  • 局部变量和全局变量使用小写 lower_case
  • 常量使用大写 UPPER_CASE
  • 类成员变量使用小写+下划线 lower_case_
  • 枚举值使用大写 UPPER_CASE
  • 类/结构体/成员函数名使用驼峰法命名 CamelCase
  • 非成员函数使用小写 lower_case

VSCode中会根据clang-tidy的分析来标出命名错误的部分。

杂项

private member

尽量将基类除外的所有类的成员变量都声明为私有,然后通过成员函数读写,基类应当将所有成员声明为公有。对于某些对性能比较敏感,或者必须要暴露出来的成员变量,可以选择将整个类的所有成员都声明为公有,或者使用// NOLINT(misc-non-private-member-variables-in-classes)关闭警告

foreach

遍历array时,避免使用传统的for循环遍历方式,既能防止越界等问题,也能使代码更加易读。

传统方法,避免使用

std::array<int, 3> data = {1, 2, 3};
for (int i = 0; i < 3; ++i) {
    cout << data[i];
}

使用迭代器

std::array<int, 3> data = {1, 2, 3};
std::array<int, 3>::iterator iter;
for (iter = data.begin(); iter != data.end(); ++iter) {
    cout << *iter;
}

使用基于范围的循环(推荐)

array<int, 10> data = {1, 2, 3};
for (int& iter : data) {
    cout << iter;
}

static cast

禁止在cpp/hpp文件中使用type(arg)或者(type)(arg)的形式来进行显式类型转换,必须使用static_cast。如果隐式类型转换中可能会产生精度丢失(例如float->int int32-> uint32 int32->int16),都必须要使用static_cast来声明显式类型转换

reinterpret cast

在两种指针类型之间转换时,除了void *,必须使用reinterpret_cast