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_
名稱空間使用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配置方式,提高解析效率。 下面是一個使用實