一、动机

代码一致才能可读、联调、高效率、高复用、可移植性。

二、命名方式

CamelCased

camelCased

under_scored

ALL_CAPITALS

2.1 Package命名方式:under_scored

2.2 Topics / Services命名方式:under_scored

2.3 Files命名方式:under_scored

比如:hokuyo_topurg_laser.cpp、hokuyo_topurg_laser.hpp

如果是类文件,那么命名方式迎合类名,比如:ActionServer类,那么action_server.h

2.3.1 lib命名方式:under_scored

不要在lib后面插入下划线,比如:

lib_my_great_thing ## Bad
libmy_great_thing ## Good

2.4 Classes / Types命名方式:CamelCased

比如:class ExampleClass

如果名字中有缩写,那么全部大写:class HokuyoURGLaser

2.5 Function / Methods

函数名称和类的方法:camelCased,参数采用:under_scored

2.6 Variables

一般采用under_scored。合理描述变量,不要表达不清。

迭代变量,比如:for(int i = 0; …),可以用短变量i, j, k;应用顺序保证为i,j,k。

STL 迭代变量,必须标明STL变量的类型如:

std::list<int> pid_list;
std::list<int>::iterator pid_it;

STL迭代器的可以用自身类型表示

std::list<int> pid_list;
std::list<int>::iterator int_it;

2.6.1 Constant命名方式:ALL_CAPITALS

2.6.2 Member variables命名方式:under_scored_

2.6.3 Global variables命名方式:g_under_scored

2.7 Namespaces命名方式:under_scored

三、License statements

在头文件与源文件的开头都要包含Copyright,比如:

Copyright (c)  Fujian(Quanzhou)-HIT Research Institute of Engineering and Technology All rights reserved.

解释一下,©是版权的意思,也可以写成(c);2019表示代码完成时间;Fujian(Quanzhou)-HIT Research Institute of Engineering and Technology 泉州工研院;All rights reserved表示保留所有权利。

也可以写成:

Copyright (c) -2020 Fujian(Quanzhou)-HIT Research Institute of Engineering and Technology All rights reserved.

2019-2020表示意思完成时间是2008年,最近一次修订在2011年。

四、Formatting

IDE应该可以处理大量的格式化事情。建议采用VSCode。

缩进为2个空格,不用tab键。Namespaces不缩进

比如:

if(a < b)
{
// do stuff
}
else
{
// do other stuff
}

单行可以不用括号,符号连接如下:

if(a < b)
x = * a; if(a < b)
{
for(int i = ; i < ; i++)
PrintItem(i);
}

下面给出一个完整的例子:

/*
* 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 -;
}
else if (x_ > other.x_)
{
return ;
}
else
{
return ;
}
}
namespace foo
{
int foo(int bar) const
{
switch (bar)
{
case :
++bar;
break;
case :
--bar;
default:
{
bar += bar;
break;
}
}
}
} // end namespace foo

4.1 每行字符数:120个字符以内

4.2 头文件格式

防止重复调用,采用以下格式:

#ifndef PACKAGE_PATH_FILE_H
#define PACKAGE_PATH_FILE_H
...
#endif

五、文档

所有程序必须有文档,而且采用doxygen建立文档。

六、控制台输出

尽量不采用printf与cout,采用 rosconsole作为输出。

七、宏

避免使用宏定义,与inline与const不同,宏既不是类型,也不是作用域。

八、预处理指令(#if vs. #ifdef)

对于条件编译,我们采用#if,不采用#ifdef。

比如:

#ifdef DEBUG
temporary_debugger_break();
#endif

如果我们想关闭DEBUG,那么会输入:

cc -c lurker.cpp -DDEBUG=

如果采用:

#if DEBUG
temporary_debugger_break();
#endif

即使DEBUG没有定义,也可以用。

九、输出参数

用于输出的参数采用指针,而不是引用。比如:

int exampleMethod(FooThing input, BarThing* output);

十、Namespaces

非常建议大家使用命名空间来指定代码的作用域,根据package的名字来命名namespace

不采用using-directive,比如

using namespace std; // Bad, because it imports all names from std::

采用using-declarations,比如:

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

十一、继承

采用virtual表示多态,不采用多重继承

十二、异常处理

异常处理采用error-report机制,而不采用返回整形值。比如:

在document记录在packages中function/method产生的全部异常。

不采用在destructors中调用throw。

不采用在callback方法中调用throw。

如果采用在package中采用错误代码,而非异常处理,请保持代码始终如一。

12.1 异常处理注意事项:

当您的代码可以被异常中断时,您必须确保在堆栈变量超出范围时将释放您保留的资源。 特别是,必须释放互斥锁,并且必须释放堆分配的内存。

十三、Enumerations(枚举类型)

用namespace控制枚举类型:

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

十四、Globals(全局类型)

不采用全局变量以及全局函数。

十五、Static class variables(静态成员变量)

不采用静态成员变量。

十六、调用exit()函数

仅在程序出口调用exit()函数。

在lib中不采用exit()函数。

十七、Assertions()

采用assert检查前提条件,数据结构完整性以及内存分配器的返回值。 assert比编写条件语句更好,条件语句很少(如果有的话)被执行。

不采用直接调用assert(),而采用ros/assert.h

/** 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.
* Example usage:
*/
ROS_ASSERT(x > y);
/** ROS_ASSERT_MSG(cond, "format string", ...) asserts that the provided
* condition evaluates to true.
* If it is false, program execution will abort, with an informative
* statement about which assertion failed, in what file, and it will print out
* a printf-style message you define. Example usage:
*/
ROS_ASSERT_MSG(x > , "Uh oh, x went negative. Value = %d", x);
/** ROS_ASSERT_CMD(cond, function())
* Runs a function if the condition is false. Usage example:
*/
ROS_ASSERT_CMD(x > , handleError(...));
/** 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). You can step over the assert
* in a debugger.
* Example usage:
*/
ROS_BREADK();

不要在assert中做工作; 只检查逻辑表达式。 根据编译设置,可能无法执行断言。

十八、Testing

gtest.

十九、Portability(可以移植性)

目前ros支持linux与XOS之间的移植,需要注意:

(1)不采用uint,采用unsigned int

(2)调用isnan()使用std::isnan()

二十、Deprecation(移除不用的代码)

如果移除包中的头文件,应在头文件加入警告:

#warning mypkg/my_header.h has been deprecated

如果移除函数,添加不推荐使用属性:

ROS_DEPRECATED int myFunc();

如果移除一个类,请移除其构造函数和任何静态函数:

class MyClass
{
public:
ROS_DEPRECATED MyClass(); ROS_DEPRECATED static int myStaticFunc();
};

ROS C++ 规范概要的更多相关文章

  1. OSGi规范概要

    目前最新的OSGi规范是2012年7月发布的Release 5,Version5.0(后文简称为R5.0)版本,该规范定义了Java模块化系统所涉及的各种场景(开发.打包.部署.更新和交互等),以及其 ...

  2. AMD 规范与CMD 规范概要

    命名冲突和文件依赖,是前端开发过程中的两个经典问题.通过模块化开发来解决. AMD 规范在这里:https://github.com/amdjs/amdjs-api/wiki/AMD CMD 规范在这 ...

  3. Java Script 编码规范【转】

    Java Script 编码规范 以下文档大多来自: Google JavaScript 编码规范指南 Idiomatic 风格 参考规范 ECMAScript 5.1 注解版 EcmaScript ...

  4. cartographer和ROS的坐标系关系

    参考定义见:backpack_3d.lua    Local map frame是一次slam过程中的原点.但是现在cartographer支持Incremental mapping.global m ...

  5. Java学习1 - java 历史

    Sun的Java语言开发小组成立于1991年,其目的是开拓消费类电子产品市场,例如:交互式电视,烤面包箱等.Sun内部人员把这个项目称为 Green,那时World Wide Web还在图纸上呢.该小 ...

  6. JS_Detail和Discipline

    编码原则 Js控件代码3部曲 (1)设置元素的 状态 在onready中添加 (2)设置元素的 动作, 每个动作 封装成 function(enclosure) (3)remove load之前 删除 ...

  7. Android qualcomm WCNSS_qcom_cfg.ini 参数介绍

    本文介绍WCNSS_qcom_cfg.ini中常用参数的作用. wifi 日志等级 vosTraceEnableBAP=255 vosTraceEnableTL=255 vosTraceEnableW ...

  8. Java 发展历史

    Java自1995诞生,至今已经20多年的历史. Java的名字的来源:Java是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名.Java语言中的许多库类名称,多与咖啡有关,如JavaBeans(咖啡豆 ...

  9. WebSphere Application Server诊断和调优

    近段时间,我们项目中用到的WebSphere应用服务器(WAS),但在客户的production环境下极不稳定,经常宕机.给客户造成非常不好的影响,同时,也给项目组很大压力.为此,我们花了近一个月时间 ...

随机推荐

  1. 撩课-Java每天10道面试题第4天

    撩课Java+系统架构 视频 点击开始学习 31.静态变量和实例变量的区别? 静态变量也叫类变量, 这种变量前加了static修饰符. 可以直接用类名调用, 也可以用对象调用, 而且所有对象的同一个类 ...

  2. FisherYates费雪耶兹随机置乱算法

    public class FisherYates { public static void main(String[] args) { int[] arr = new int[10]; // 初始有序 ...

  3. git 命令合并分支代码

    git 命令合并分支代码 对于复杂的系统,我们可能要开好几个分支来开发,那么怎样使用git合并分支呢? 合并步骤: 1.进入要合并的分支(如开发分支合并到master,则进入master目录) git ...

  4. ES6学习笔记(四)-数值扩展

    PS: 前段时间转入有道云笔记,体验非常友好,所以笔记一般记录于云笔记中,每隔一段时间,会整理一下, 发在博客上与大家一起分享,交流和学习. 以下:

  5. 第三天-基本数据类型 int bool str

    # python基础数据类型 # 1. int 整数 # 2.str 字符串.不会用字符串保存大量的数据 # 3.bool 布尔值. True, False # 4.list 列表(重点) 存放大量的 ...

  6. BZOJ4568: [Scoi2016]幸运数字(线性基 倍增)

    题意 题目链接 Sol 线性基是可以合并的 倍增维护一下 然后就做完了?? 喵喵喵? // luogu-judger-enable-o2 #include<bits/stdc++.h> # ...

  7. Typescript中一些不理解的概念解释(泛型、断言、解构、枚举)

    新的项目想使用typescript,因此又对其概念及使用过一遍,本文主要记录下对之前一些概念不太理解的地方. 1.泛型 定义: 在定义函数.接口或者类的时候,不预先指定具体的类型,而是在使用的时候再指 ...

  8. ECharts 柱状图顶部显示百分比

    1.引入jquery.js和echarts.js <script src="../jquery-1.8.3.min.js" type="text/javascrip ...

  9. js如何获取response header信息

    信息转自网上 普通的请求JS无法获取,只有ajax请求才能获取到. $.ajax({ type: 'HEAD', // 获取头信息,type=HEAD即可 url : window.location. ...

  10. MySQL数据库(11)----使用子查询实现多表查询

    子查询指的是用括号括起来,并嵌入另一条语句里的那条 SELECT 语句.下面有一个示例,它实现的是找出与考试类别('T')相对应的所有考试事件行的 ID,然后利用它们来查找那些考试的成绩: SELEC ...