18、Linux下编程风格
在前面曾總結過微軟環境下編程的規范【1】,但是在linux下,沒有自動補起,以及沒有像VS那樣高級好用的可視化開發工具,如果變量,函數定義太復雜,敲的也累,下面總結linux下編程風格,資料來源于網絡。
一、GNU風格
1.函數返回類型說明和函數名分兩行放置,函數起始字符和函數開頭左花括號放到最左邊,
例如:
static char *
main (argc, argv)
?? int argc;
?? char *argv[];
{
......
}
或者是用標準C:
static char *
main (int argc, char *argv[])
{
......
}
如果參數太長不能放到一行,請在每行參數開頭處對齊:
int
net_connect (struct sockaddr_in *cs, char *server, unsigned short int
port,
???? ??? char *sourceip, unsigned short int sourceport, int sec)
對于函數體,我們應該按照如何方式排版:
在左括號之前、逗號之后,以及運算符號前后添加空格使程序便于閱讀,例如:
if (x < foo (y, z))
? haha = bar[4] + 5;
else
? {
?? while (z)
????? {
??????? haha += foo (z, z);
??????? z--;
????? }
??? return ++x + bar ();
}
當一個表達式需要分成多行書寫的時候,應該在操作符之前分割。例如:
if (foo_this_is_long && bar > win (x, y, z)
&& remaining_condition)
2. 盡量不要讓兩個不同優先級的操作符出現在相同的對齊方式中,應該附加額外的括號使得代碼縮進可以表示出嵌套。例如:
錯誤的對齊:
mode = (inmode[j] == VOIDmode
??????? || GET_MODE_SIZE (outmode[j]) > GET_MODE_SIZE (inmode[j])
??????? ? outmode[j] : inmode[j];
正確的對齊:
mode = ((inmode[j] == VOIDmode
??????? || (GET_MODE_SIZE (outmode[j]) > GET_MODE_SIZE(inmode[j])))
??????? ? outmode[j] : inmode[j];
3. 按照如下方式排版do-while語句:
do
? {
??? a = foo (a);
? }
while (a > 0);
4. 每個程序都應該以一段簡短的說明其功能的注釋開頭。例如:
/* fmt - filter for simple filling of text */
5. 請為每個函數書寫注釋,說明函數做了什么,需要那些種類的參數,參數可能值的含義和用途。如果用了非常見的、非標準的東西,或者可能導致函數不能工作的任何可能的值,應該對他們進行說明。如果存在重要的返回值,也需要說明。
6. 不要聲明多個變量時跨行,每一行都以一個新的聲明開頭。例如:
錯誤的聲明:
int foo,
??? bar;
正確的聲明:
int foo, bar;
或者:
int foo;
int bar;
如果他們是全局變量,在每一個之前都應該注釋。
7. 當一個if中嵌套了另一個if-else時,應用花括號把if-else括起來。例如,不要寫:
if (foo)
? if (bar)
??? win ();
? else
??? lose ();
而要寫:
if (foo)
? {
if (bar)
????? win ();
??? else
????? lose ();
?? }
如果再else中嵌套了一個if,可以這樣寫else if:
if (foo)
? ...
else if (bar)
...
按照與then那部分代碼相同的縮進方式縮進else if的then部分代碼,也可以在花括號
中像下面那樣把if嵌套起來:
if (foo)
...
else
{
if (bar)
...
}
8. 要在同一個聲明中同時說明結構標識和變量或者結構標識和類型定義(typedef)。單獨的說明結構標識,而后用它定義變量或者定義類型。
9. 盡量避免在if的條件中進行賦值。例如,不要寫:
if ((foo = (char *) malloc (sizeof *foo)) == 0)
fatal ("virtual memory exhausted");
而要寫:
foo = (char *) malloc (sizeof *foo);
if (foo == 0)
fatal ("virtual memory exhausted");
10. 請在名子中使用下劃線以分割單詞,盡量適用小寫;把大寫字母留給宏和枚舉常量,以及根據統一慣例使用前綴。例如,應該使用類似ignore_space_change_flag的名子;不要使用類似iCantReadThis的名子。
11. 用于表明一個命令行選項是否給出的變量應該在選項含義的說明之后,而不是選項字符之后被命名。一條注釋既應該說明選項的精確含義,又應該說明選項的字母。例如:
/* ignore changes in horizontal whitespace (-b). */
int ignore_space_change_flag;
二、Linux 內核編程風格
1. Linux內核縮進風格是8個字符。
2. Linux內核風格采用K&R標準,將開始的大括號放在以行的最后,而將結束的大括號放在以行的第一位,如下:
if (x == 1) {
......
}
命名函數時,開始的括號使放在下一行的第一位,如下:
int function(int x)
{
......
}
結束的括號在它所占的那一行是空的,除了它還可以跟隨著同一條語句的繼續符號。如
while在do-while循環,或者else在if語句中。如下:
do {
......
) while (condition);
以及:
if (x == y) {
...
} else if (x > y) {
...
) else {
...
}
3. 命名盡量簡潔。不應該使用諸如 ThisVariableIsATemporaryCounter之類的名子。應該命名為tmp,這樣容易書寫,也不難理解。但是命名全局變量,就應該用描述性命名方式,例如應該命名count_active_users(),而不是cntusr()。本地變量應該避免過長。
4. 函數最好短小精悍,一般來說不要讓函數的參數多于10個,否則你應該嘗試分解這個過于復雜的函數。
5. 通常情況,注釋說明代碼的功能,而不是其實現原理。避免把注釋插到函數體內,而寫到函數前面,說明其功能,如果這個函數的確很復雜,需要其中有部分注釋,可以寫些簡短的注釋來說明或禁告那些重要的部分,但是不能過多。
如果你感覺這些規則過于復雜,有一個小工具可以幫助你——indent。例如你要把你代碼轉換成GNU或Linux核心風格,你可以分別使用:
indent -gnu test.c
indent -kr -i8 test.c
其他用法請使用man indent查詢。
【1】http://www.cnblogs.com/mydomain/archive/2010/12/03/1895777.html
【2】 http://www.huihoo.org/gnu/c.html
轉載于:https://www.cnblogs.com/mydomain/archive/2011/07/30/2121823.html
總結
以上是生活随笔為你收集整理的18、Linux下编程风格的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: webstorm主题
- 下一篇: 机器学习之微积分零基础学习