Skip to content

C++#

警告

正在施工中

参考资料#

如果此页面上未定义规则,请遵循以下准则.

  1. https://docs.ros.org/en/humble/Contributing/Code-Style-Language-Versions.html
  2. https://www.autosar.org/fileadmin/standards/adaptive/22-11/AUTOSAR_RS_CPP14Guidelines.pdf
  3. https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines

此外,建议将 Clang-Tidy 应用于每个文件. 有关用法,请参阅 将 Clang-Tidy 应用于 ROS中.

请注意,并非所有规则都包含在 Clang-Tidy 中.

样式规则#

按定义的顺序包含头文件(必需,部分自动化)#

理由#

  • 由于间接依赖关系,如果标头顺序不同,C++ 的 include 系统会做出不同的行为.
  • 为了减少意外的错误,本地头文件应该放在第一位.

参考资料#

示例#

按以下顺序包含标头:

  • 主模块头
  • 本地包头
  • 其他包头
  • 消息标头
  • Boost 标头
  • C 系统接头
  • C++ 系统头文件
// Compliant
#include "my_header.hpp"

#include "my_package/foo.hpp"

#include <package1/foo.hpp>
#include <package2/bar.hpp>

#include <std_msgs/msg/header.hpp>

#include <iostream>
#include <vector>

如果你正确地使用了 ``<> , pre-commit 中的 ClangFormat 会自动对头进行排序.

不要在 #include 行之间定义宏,因为它会阻止自动排序.

// Non-compliant
#include <package1/foo.hpp>
#include <package2/bar.hpp>

#define EIGEN_MPL2_ONLY
#include "my_header.hpp"
#include "my_package/foo.hpp"

#include <Eigen/Core>

#include <std_msgs/msg/header.hpp>

#include <iostream>
#include <vector>

相反,在 #include 行之前定义宏.

// Compliant
#define EIGEN_MPL2_ONLY

#include "my_header.hpp"

#include "my_package/foo.hpp"

#include <Eigen/Core>
#include <package1/foo.hpp>
#include <package2/bar.hpp>

#include <std_msgs/msg/header.hpp>

#include <iostream>
#include <vector>

如果有任何理由在特定位置定义宏,请在宏之前写一条注释.

// Compliant
#include "my_header.hpp"

#include "my_package/foo.hpp"

#include <package1/foo.hpp>
#include <package2/bar.hpp>

#include <std_msgs/msg/header.hpp>

#include <iostream>
#include <vector>

// For the foo bar reason, the FOO_MACRO must be defined here.
#define FOO_MACRO
#include <foo/bar.hpp>

函数名称使用小蛇形大小写(必需,部分自动化)#

理由#

  • 与 C++ 标准库一致.
  • 它与 Python 和 Rust 等其他编程语言一致.

异常#

  • 对于从外部项目类(如 Qt)继承的类的成员函数,请遵循该命名约定.

参考资料#

示例#

void function_name()
{
}

枚举名称使用大写驼峰式大小写(必需,部分自动化)#

理由#

  • ROS 2 核心包一致.

异常#

  • rosidl 文件中定义的枚举可以使用其他命名约定.

参考资料#

示例#

enum class Color
{
  Red, Green, Blue
}

对常量名称使用小写蛇形大小写(必需,部分自动化)#

理由#

  • ROS 2 核心包一致.
  • 它与 std::numbers 一致.

异常#

  • rosidl 文件中定义的常量可以使用其他命名约定.

参考资料#

示例#

constexpr double gravity = 9.80665;

将复合词的首字母缩略词和缩写数为一个单词(必需,部分自动化)#

理由#

  • 澄清首字母缩略词是连续的单词的界限.

参考资料#

示例#

class RosApi;
RosApi ros_api;

不要将 auto 关键字与 Eigen 的表达式一起使用(必需)#

理由#

  • 避免将 auto 与 Eigen::MatrixEigen::Vector 变量一起使用,因为这可能会导致错误.

参考资料#

使用 RCLCPP_* (例如 RCLCPP_INFO) 宏而不是 printf 或 std::cout 进行日志记录(必需)#

理由#

  • 原因包括:
    • 它允许一致的日志级别管理.例如,使用 RCLCPP_* 宏,您只需设置 --log_level 即可在整个应用程序中统一调整日志级别.
    • 您可以使用 RCUTILS_CONSOLE_OUTPUT_FORMAT 标准化格式.
    • 使用 RCLCPP_* 宏时,日志会自动记录到 /rosout 中.这些日志可以保存到 rosbag 中,然后可以重放该 rosbag 以查看日志数据.

参考资料#