對於編碼,每個碼農或許都會有自己的一套風格,很多人可能對編碼風格壓根就不關心,因為最終編譯器編譯出來的目標代碼並不會受影響。但是在開發一個大型項目時,花費時間成本最多的永遠是開發者們之間的溝通與交流。保持編碼風格的一致性可以在很大程度上提高編碼效率,可以讓其他人更容易讀懂你的代碼,也讓你更容易讀懂其他人的代碼。
在選擇編碼風格上,個人更青睞於Linux的編碼風格,所以特意總結了一下:
1、縮進
Linux的縮進風格是用制表符(tab)每次縮進八個字符長度。這里強調的是制表符,並不是用幾個空格符來替代。如果在Linux里面八個字符長度的制表符顯得太長的話,那我們還是最好來修改自己的代碼吧!最好不要在代碼中用四層及以上的嵌套縮進。在switch...case...語句中,switch與case具有相同的縮進。
在Windows上面默認制表符是4個字符長度,所以不必去在意到底幾個字符長度,只要每次縮進使用制表符即可。
2、括號
Linux的風格是:
(1)對於函數的左右括號,左右括號分別為單獨的一行:
int func() { /* .... */ }
(2)對於控制語句中的左右括號,左括號緊跟在語句的后面,與語句在相同的一行,而右括號新起一行,作為該行的第一個字符:
if (x){ /* .... */ }
如果接下來的部分是相同語句的一部分,那么右括號不單獨占一行:
if (x){ /* ... */ }else{ /* ... */ } 或者 do { /* ... */ }while(x);
如果不是一定要括號的語句,就忽略它:
if (x) do_something(); else do_otherthing();
但是對於條件語句來說,如果一個分支是一行語句,另一個語句是多行,則需要保持一致,使用花括號:
if (condition){ do_this(); do_that(); }else{ do_something(); }
3、空格
(1)在關鍵字“if,switch,case,for,do,while”之后需要加上空格
if (condition)
(2)在關鍵字“sizeof,typedef,alignof,__attribute__”之后不需要加空格:
sizeof(int);
(3)在括號里的表達式兩邊不需要加空格;
(4)大多數的二元和三元運算符兩邊需要加空格,“= + - < > * / % | & ^ <= >= == != ? :”;
(5)一元運算符后面不加空格,“& * + - ~ ! sizeof typedef alignof __attribute__”;
(6)在前綴自增自減運算符之后和后綴自增自減運算符之前不需要空格,“++ --”;
(7)結構成員運算符的兩邊不需要空格,“. ->”;
4、命名規范
Linux的名稱中不允許使用混合的大小寫字符。局部變量應該盡量可以清楚地表明它的用途;全局變量和函數應該選擇包含描述性內容的名稱。
5、函數
函數的代碼程度不應該超過兩屏,局部變量不應該超過10個。一個很大的函數盡量分成一些更短小的函數的組合,每個函數應該功能單一並且實現精准。如果擔心函數調用帶來開銷,可以把小函數聲明為inline。
如果函數的名稱是一種動作或者命令式的語句,應該以錯誤代碼的形式返回(一般0表示成功,-Exxx形式的負數表示錯誤),如:do_something()
如果函數的名稱是判斷語句,則返回值應該類似於布爾值(1表示成功,0表示失敗),如:something_is_exist()
6、宏
多行的宏定義要用"do...while"來封裝,如:
#define func(a,b,c) \ do { \ if (a > b) \ do_something(c); \ }while(0)
7、注釋
注釋應該描述的是代碼要做什么和為什么要這么做,而不應該描述具體通過什么方式來實現。如何實現應該通過代碼本身來展現。不要把作者,日期等一些沒有意義的內容寫在注釋里面,這些信息應該集中寫在文件最開頭的地方。在Linux中采用C89的注釋風格“ /* ... */ ”,不采用C99的“ // .... ”
/* * get_foo() - return the current value of foo * We need this to calculate the bar ratio. This can sleep, * so do not call while holding a lock */ int get_foo(){ ... return foo; }
只有在特殊情況下才會在函數里面注釋。比如聲明一個bug或者某個重要的假設。在注釋里面,重要信息以“XXXX:”開頭。
編碼是一種藝術。我們碼的不僅僅是代碼,更是一種情懷。