linux內核的編碼是一種極端情況
需要清晰明朗以供全世界的開發者學習
相信linus大神在長期接觸各種各式代碼後脾氣會變得更暴躁
節選
如果你開發PHP程序的核心代碼
雖然
linux kernel coding style (針對PHPer作了節選)
linux kernel coding style的中文譯者:
中文版維護者
中文版翻譯者
中文版校譯者
wheelz
管旭東 Xudong Guan
Li Zefan
Wang Chen
第一章
制表符是
理由
現在
在switch語句中消除多級縮進的首選的方式是讓
C++代碼
switch (suffix) {
case
case
mem <<=
break;
case
case
mem <<=
break;
case
case
mem <<=
/* fall through */
default:
break;
}
不要把多個語句放在一行裡
C++代碼
if (condition) do_this;
do_something_everytime;
也不要在一行裡放多個賦值語句
除了注釋
選用一個好的編輯器
第二章
代碼風格的意義就在於使用平常使用的工具來維持代碼的可讀性和可維護性
每一行的長度的限制是
長於
C++代碼
void fun(int a
{
if (condition)
printk(KERN_WARNING
else
next_statement;
}
第三章
C語言風格中另外一個常見問題是大括號的放置
C++代碼
if (x is true) {
we do y
}
這適用於所有的非函數語句塊(if
C++代碼
switch (action) {
case KOBJ_ADD:
return
case KOBJ_REMOVE:
return
case KOBJ_CHANGE:
return
default:
return NULL;
}
不過
C++代碼
int function(int x)
{
body of function
}
全世界的異端可能會抱怨這個不一致性是……呃……不一致的
注意結束大括號獨自占據一行
C++代碼
do {
body of do
} while (condition);
和
C++代碼
if (x == y) {
} else if (x > y) {
} else {
}
理由
也請注意這種大括號的放置方式也能使空(或者差不多空的)行的數量最小化
當只有一個單獨的語句的時候
C++代碼
if (condition)
action();
這點不適用於本身為某個條件語句的一個分支的單獨語句
C++代碼
if (condition) {
do_this();
do_that();
} else {
otherwise();
}
Linux內核的空格使用方式(主要)取決於它是用於函數還是關鍵字
所以在這些關鍵字之後放一個空格
if
但是不要在sizeof
C++代碼
s = sizeof(struct file);
不要在小括號裡的表達式兩側加空格
C++代碼
s = sizeof( struct file );
當聲明指針類型或者返回指針類型的函數時
數名
C++代碼
char *linux_banner;
unsigned long long memparse(char *ptr
char *match_strdup(substring_t *s);
在大多數二元和三元操作符兩側使用一個空格
C++代碼
= +
但是一元操作符後不要加空格
C++代碼
& * +
後綴自加和自減一元操作符前不加空格
++
前綴自加和自減一元操作符後不加空格
++
不要在行尾留空白
當git發現補丁包含了行尾空白的時候會警告你
第四章
C是一個簡樸的語言
不過
全局變量(只有當你真正需要它們的時候再用它)需要有一個具描述性的名字
在函數名中包含函數類型(所謂的匈牙利命名法)是腦子出了問題——編譯器知道那些類型而且能夠檢查那些類型
本地變量名應該簡短
如果你怕混淆了你的本地變量名
第六章
函數應該簡短而漂亮
一個函數的最大長度是和該函數的復雜度和縮進級數成反比的
不過
函數的另外一個衡量標准是本地變量的數量
在源文件裡
第八章
注釋是好的
的做法是讓別人一看你的代碼就可以明白
一般的
放在一個函數體內部
第六章看一看
加太多
些事情的原因
當注釋內核API函數時
Documentation/kernel
Linux的注釋風格是C
長(多行)的首選注釋風格是
C++代碼
/*
* This is the preferred style for multi
* comments in the Linux kernel source code
* Please use it consistently
*
* Description: A column of asterisks on the left side
* with beginning and ending almost
*/
注釋數據也是很重要的
聲明一個數據(不要使用逗號來一次聲明多個數據)
小注釋來解釋它們的用途了
對於PHPER來講
第九章
這沒什麼
自動幫你格式化C源代碼
想要的相去甚遠(實際上
會創造出一個好程序)(譯注
所以你要麼放棄GNU emacs
第十二章
用於定義常量的宏的名字及枚舉裡的標簽需要大寫
C++代碼
#define CONSTANT
宏的名字請用大寫字母
第十三章
內核開發者應該是受過良好教育的
用不規范的單詞比如
歧義
內核信息不必以句號(譯注
寫出好的調試信息可以是一個很大的挑戰
就會成為極大的幫助
(也就是說
第十八章
有一些編輯器可以解釋嵌入在源文件裡的由一些特殊標記標明的配置信息
能夠解釋被標記成這樣的行
或者這樣的
/*
Local Variables:
compile
End:
*/
Vim能夠解釋這樣的標記
/* vim:set sw=
這包括有關縮進和模式配置的標記
式
不要在源代碼中包含任何這樣的內容
該覆蓋別人的配置
簡而言之
時候可以給你警告
From:http://tw.wingwit.com/Article/program/PHP/201311/20805.html