ROS的编码风格和命名约定

参考:http://wiki.ros.org/CppStyleGuide

可以使用clang-format来自动格式化(不要理解错了,formatting)你的代码.

1、命名规则

有以下几种命名格式:

  • CamelCased:名称以大写字母开头,每个新单词都有大写字母,不带下划线。
  • camelCased:和CamelCase一样,但是用小写的第一个字母
  • under_scored:该名称只使用小写字母,单词之间用下划线分隔。
  • ALL_CAPITALS:所有大写字母,单词之间用下划线分隔。

ROS的功能包名称使用under_scored;

文件使用under_scored(如果文件内实现的是一个类,则把类名变为这种格式来给文件命名);

库使用under_scored(与lib之间不要有下划线如libmy_girls);

类或类型使用CamelCased(缩写全大写);

函数或方法使用camelCased,参数使用under_scored,函数名通常表示动作,应把动词放前面;

变量使用under_scored合理描述,尽量不要模糊,更长的变量名不会占用更多空间。积分迭代器变量可以非常短,如i,j,k。 在你如何使用迭代器方面保持一致(例如,i在外部循环中,j在下一个内部循环中);

常量使用ALL_CAPITALS

成员变量在under_scored后面添加下划线,如example_int_;

全局变量在under_scored前加g_,如g_shutdown,一般不应该使用全局变量;

命名空间使用under_scored


2、格式规定

每块缩进2个空格,切勿插入文字标签字符,命名空间的内容不缩进,成对的大括号要在一条线上。例如:

if(a < b)
{
  // do stuff
}
else
{
  // do other stuff
}
如果一块是一行代码,则可以省略大括号。

例子:

/*
 * A block comment looks like this...
 */
#include <math.h>
class Point
{
public:
  Point(double xc, double yc) :
    x_(xc), y_(yc)
  {
  }
  double distance(const Point& other) const;
  int compareX(const Point& other) const;
  double x_;
  double y_;
};
double Point::distance(const Point& other) const
{
  double dx = x_ - other.x_;
  double dy = y_ - other.y_;
  return sqrt(dx * dx + dy * dy);
}
int Point::compareX(const Point& other) const
{
  if (x_ < other.x_)
  {
    return -1;
  }
  else if (x_ > other.x_)
  {
    return 1;
  }
  else
  {
    return 0;
  }
}
namespace foo
{
int foo(int bar) const
{
  switch (bar)
  {
    case 0:
      ++bar;
      break;
    case 1:
      --bar;
    default:
    {
      bar += bar;
      break;
    }
  }
}
} // end namespace foo

1)单行长度不要超过120个字母。

2)头文件必须包含#ifndef,例如:

#ifndef PACKAGE_PATH_FILE_H
#define PACKAGE_PATH_FILE_H
...
#endif

3、控制台输出

使用rosconsole代替cout,printf等等输出命令。它有以下优点:

  • color-coded
  • controlled by verbosity level and configuration file
  • published on /rosout, and thus viewable by anyone on the network (only when working with roscpp)

  • optionally logged to disk

4、尽可能避免使用预处理器宏。

5、对于条件编译,要使用#if ,而不使用#ifdef

6、方法/函数的(即函数可以修改的变量)输出参数是通过指针传递的,而不是通过引用传递的。

7、命名空间

鼓励使用命名空间限制代码,但是注意命名合理,具有描述性。

注意切勿在头文件中使用using指令, 这样做会污染包含标题的所有代码的名称空间。

源文件中使用using命令是acceptable,但是最后使用你使用的名称。例如

不要这样:

using namespace std; // 不好,因为它引入了标准库中的所有命名

要这样:

using std::list;  // I want to refer to std::list as list
using std::vector;  // I want to refer to std::vector as vector

8、继承

继承是定义和实现通用接口的适当方式。 基类定义了接口,并且子类实现它。

继承也可以用来提供从基类到子类的通用代码。 这种继承的使用是不鼓励的。 在大多数情况下,“子类”可以使用“基类”的实例(就是在其中声明具体对象),来获得相同的结果,但混淆的可能性较小。

当重写子类中的虚函数时,总是声明它是virtual的,以便读者知道发生了什么。

强烈建议不要使用多继承。

9、异常

异常是首选的错误报告机制,而不是返回整数错误代码。

始终记录每个函数/方法可以抛出什么异常。

不要从析构函数中抛出异常。

不要从不直接调用的回调中抛出异常。

如果您在软件包中选择使用整数错误代码而不是异常,请仅使用错误代码。 始终如一。

当代码可能被异常中断时,您必须确保当堆栈变量超出范围时,您持有的资源将被释放。 特别是,必须释放互斥锁,并且必须释放堆分配的内存。 通过使用以下互斥量守护程序和智能指针来实现此安全性。

10、枚举类型

使用命名空间包括您的枚举

namespace Choices
{
  enum Choice
  {
     Choice1,
     Choice2,
     Choice3
  };
}
typedef Choices::Choice Choice;

这可以防止枚举污染它们所在的命名空间。 枚举中的单个项目被引用为:Choices :: Choice1,但typedef仍允许声明Choice枚举而不使用名称空间。

11、全局

全局变量和函数都是不鼓励的。 它们污染了命名空间并使代码更少重用。

全球变量,特别是,强烈不鼓励。 它们阻止了一段代码的多个实例,并使多线程编程成为一场噩梦。

大多数变量和函数应该在类中声明。 其余部分应在名称空间内声明。

例外:一个文件应包含一个main()函数和少数几个全局小帮助函数。 但请记住,有一天,这些帮助函数可能对其他人有用。

12、不鼓励静态类变量。 它们阻止了一段代码的多个实例,并使多线程编程成为一场噩梦。

13、exit()

只能在应用程序的明确定义的出口点调用exit()。

切勿在库中调用exit()。

14、断言

使用断言来检查先决条件,数据结构完整性和内存分配器的返回值。 断言比编写条件语句要好,如果这些条件语句很少会被执行的话。

不要直接调用assert()。 而是使用ros/assert.h(rosconsole包的一部分)中声明的这些函数之一:

/** ROS_ASSERT asserts that the provided expression evaluates to
 * true.  If it is false, program execution will abort, with an informative
 * statement about which assertion failed, in what file.  Use ROS_ASSERT
 * instead of assert() itself.
 */
#define ROS_ASSERT(expr) ...

/** ROS_BREAK aborts program execution, with an informative
 * statement about which assertion failed, in what file. Use ROS_BREAK
 * instead of calling assert(0) or ROS_ASSERT(0).
 */                                                         
#define ROS_BREAK() ...
不要在断言中工作; 只检查逻辑表达式。 根据编译设置,断言可能不会被执行。


此外还有一些规则没有列出,可以进入ROS wiki查看。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~补充一些其他的约定,我们约~~~~~~~~~~~~~~~~

附1、消息单位的规定(SI)

附2、坐标的规定

使用右手定则,右手握向为正方向。并且必须以x:forward,y:left,z:up的形式进行编程。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值