C++#
警告
正在施工中
参考资料#
如果此页面上未定义规则,请遵循以下准则.
- https://docs.ros.org/en/humble/Contributing/Code-Style-Language-Versions.html
- https://www.autosar.org/fileadmin/standards/adaptive/22-11/AUTOSAR_RS_CPP14Guidelines.pdf
- 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文件中定义的枚举可以使用其他命名约定.
参考资料#
- http://wiki.ros.org/CppStyleGuide (参考
15.枚举)
示例#
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::Matrix或Eigen::Vector变量一起使用,因为这可能会导致错误.
参考资料#
使用 RCLCPP_* (例如 RCLCPP_INFO) 宏而不是 printf 或 std::cout 进行日志记录(必需)#
理由#
- 原因包括:
- 它允许一致的日志级别管理.例如,使用 RCLCPP_* 宏,您只需设置 --log_level 即可在整个应用程序中统一调整日志级别.
- 您可以使用 RCUTILS_CONSOLE_OUTPUT_FORMAT 标准化格式.
- 使用 RCLCPP_* 宏时,日志会自动记录到 /rosout 中.这些日志可以保存到 rosbag 中,然后可以重放该 rosbag 以查看日志数据.