對於編碼,每個碼農或許都會有自己的一套風格,很多人可能對編碼風格壓根就不關心,因為最終編譯器編譯出來的目標代碼並不會受影響。但是在開發一個大型項目時,花費時間成本最多的永遠是開發者們之間的溝通與交流。保持編碼風格的一致性可以在很大程度上提高編碼效率,可以讓其他人更容易讀懂你的代碼,也讓你更容易讀懂其他人的代碼。
在選擇編碼風格上,個人更青睐於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:”開頭。
編碼是一種藝術。我們碼的不僅僅是代碼,更是一種情懷。