1. 程式人生 > >ROS的編碼風格和命名約定

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的形式進行程式設計。


相關推薦

ROS編碼風格命名約定

參考:http://wiki.ros.org/CppStyleGuide可以使用clang-format來自動格式化(不要理解錯了,formatting)你的程式碼.1、命名規則有以下幾種命名格式:CamelCased:名稱以大寫字母開頭,每個新單詞都有大寫字母,不帶下劃線。

自己總結的C#編碼規範--1.命名約定

命名約定 我們在命名識別符號時(包括引數,常量,變數),應使用單詞的首字母大小寫來區分一個識別符號中的多個單詞,如UserName. PascalCasing PascalCasing包含一到多個單詞,每一個單詞第一個字母大寫,其餘字母均小寫。例如:HelloWorld、SetN

Spring框架參考文件 2.3.1 依賴管理命名約定

2.3.1 依賴管理和命名約定 依賴管理和依賴注入是不同的事情。要將Spring的這些優秀功能整合到您的應用程式中(如依賴注入),您需要組裝所需的所有庫(jar檔案)並在執行時將它們放到類路徑中,並且可能在編譯時。這些依賴項不是注入的虛擬元件,而是檔案系統中的物理資源(通常

C++ 變數命名約定風格

1、 變數名只能是字母(A-Z,a-z)和數字(0-9)或者下劃線(_)組成。 2、 第一個字母必須是字母或者下劃線開頭。 3、 不能使用C++關鍵字來命名變數,以免衝突。 4、 變數名區分大小寫。 變數命名規則: 一、 用最短字元表示最準確的意義。 二、 

pear 安裝php_codesniffer phpstorm設置統一編碼風格

編碼風格 ado href cmd ffffff exe tex 風格 ref 詳細按照參考http://www.cnblogs.com/huangbx/p/php_codesniffer.html pear下載地址http://pear.php.net/go-pearph

java 編碼規範 1 命名風格

【強制】程式碼中的命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結束。反例:_name / __name / $Object / name_ / name$ / Object$ 【強制】

Google C++Style Guide【C++程式設計風格指南解讀】——命名約定

       最重要的一致性規則是命名管理. 命名風格快速獲知名字代表是什麼東東: 型別? 變數? 函式? 常量? 巨集 ... ? 甚至不需要去查詢型別宣告. 我們大腦中的模式匹配引擎可以非常可靠的

c語言語系的命名風格java繫命名風格

c語言系的命名風格:單詞之間使用下劃線分隔。如上圖。 java語言是另外一個系,javascript屬於java語系(當年就是想借助java的名氣所以命名javascript)。java語系是駝峰式命名法,如getElementById()。如果使用c語系命名風格則使用下劃線分隔 get_e

Python—PEP8編碼命名習慣

 程式碼編排     使用4空格縮排,不使用Tab,更不允許用Tab和空格混合縮排     每行最大長度最大79位元組,超過部分使用反斜槓折行     類和全域性函式定義間隔兩個空行,類內方法定義間隔一個空行.其它地方可以不加空行。 文件編排     其中import部

Thinking in java之編碼風格(java命名規則)

在“java程式語言編碼約定”中,程式碼風格是這一規定的: 類名的首字母要大寫,如果類名由幾個單詞構成,那麼把他們拼在一起(也就是說不要用下劃線來分隔名字),其中每個單詞的首字母都採用大寫的形式。這樣

OpenCV學習(3)——命名風格基本資料結構

//-------------------------------------------- CvPoint point; point.x = 40; point.y = 50; //--------------------------------------------

javaScript中的數據類型命名規則

mbo ble 連接 ron define not nan 註意 實的 有7種數據類型: undefined(未定義) null(空), boolean(布爾型) string(字符串) symbol(符號), number(數字) object(對象) 命名規則 Var

springmvc.xml文件的位置命名

文件 blog img 位置 log cnblogs 文件的 pat 物理 一般情況下,需要在web.xml中進行如下配置: springmvc.xml的文件目錄是:classpath:springmvc.xml,物理文件位置: 上面是通常意義的做法,其實還可以

PSR-2 編碼風格規範

rabl val 字符 調用 所有 public 修飾符 class 只有一個 本篇規範是 PSR-1 基本代碼規範的繼承與擴展。 本規範希望通過制定一系列規範化PHP代碼的規則,以減少在瀏覽不同作者的代碼時,因代碼風格的不同而造成不便。 當多名程序員在多個項目中合作時,就

5種主要的編程風格它們使用的抽象

風格 計算 框架 目標 設計 其他 關系 不變 bsp 大部分程序員使用一種編程語言,並只使用一種編程風格。他們使用的編程方式是所用語言強加給他們的。通常,他們沒有機會換一種方式來思考問題,因此難以看到選擇更適合手上問題的編程風格所帶來的好處。 面向過程 算法 面向對象

MySQL大小寫敏感問題命名規範

列名 數據庫 lower ace 是否 有一個 文件中 itl 能夠 轉自:http://www.cnblogs.com/conanwang/p/5927557.html 1.MySQL大小寫敏感規則 MySQL中,一個庫會對應一個文件夾,庫裏的表會則以文件的方式存放在

我用的C/C++編程規範——命名約定

usr cas 字母 必須 name children conf hang 類成員變量 我使用的命名約定是google的規範,以下內容摘自《google cpp style guide》。 最重要的一致性規則是命名管理,命名風格直接可以直接確定命名實體是:類型、變量、函數、

[中英對照]Linux kernel coding style | Linux內核編碼風格

ril views har func Language config req bing evel Linux kernel coding style | Linux內核編碼風格 This is a short document describing the preferre

管道命名管道

for ram 足夠 如果 復制 表示 pes title printf 命名管道(named PIPE) 由於基於fork機制,所以管道只能用於父進程和子進程之間,或者擁有相同祖先的兩個子進程之間 (有親緣關系的進程之間)。為了解決這一問題,Linux提供了FIFO方式連

Nginx的try_files指令命名location使用實例

解析 tor blank www. oca 字符 tar sch ofo Nginx的配置語法靈活,可控制度非常高。在0.7以後的版本中加入了一個try_files指令,配合命名location,可以部分替代原本常用的rewrite配置方式,提高解析效率。 下面是一個使用實