Linux kernel coding style(http://lxr.linux.no/linux/Documentation/CodingStyle)也算是coding convention的聖經吧。老實說我覺得規定coding style是對團體的考量多於個人的考量。按照這份文件,就我知道的寫一下。
Chapter 1: Indentation
- tab/indent要八個,這也是programmer的麻吉vi預設的設定。
- 一行有80個欄(columns),方便打印與觀看。
Chapter 2: Breaking long lines and strings
- function的寫法,開始的大括號在function宣告下面。
- if/witch/do-while的寫法,開始的大括號在function宣告後面。
- 判斷是如果只有一個conditional statement可以不用加括號(不過這點本人不太建議)
- if-else 就算單一個conditional statement也要加括號。
3.1: Spaces
- 在下面的keywords後空一格
if, switch, case, for, do, while but not with sizeof, typeof, alignof, or __attribute__. E.g., - 運算元前後個各空一格。
Chapter 4: Naming
- local的話,善用tmp這類的變數,不要把暫存的資料變數名稱取名的落落長,越短越好。
- global的話,就要特別注意,如果取作foo就是自討苦吃。
- 在這邊的function名稱不流行大大小小(大寫混合小寫的)命名宣告,以小寫配合底線去宣告,例如count_active_users()。
Chapter 5: Typedefs
- 如果是struct宣告的話,使用
struct virtual_container *a;
不要使用
vps_t a; - 後面哩哩叩叩講了一堆,有空再看。
Chapter 6: Functions
Chapter 7: Centralized exiting of functions
Chapter 8: Commenting
- 這邊講解註解要寫些甚麼。
- 這邊用的是 C89 "/* ... */" 這種格式。
- 不要用C99-style "// ..." 的格式。
Chapter 9: You've made a mess of it
Chapter 10: Kconfig configuration files
Chapter 11: Data structures
Chapter 12: Macros, Enums and RTL
Chapter 13: Printing kernel messages
- 確保不含糊的輸出你的debug訊息。
- "dont" 應該改成 "do not” 或 "don’t”。
- 不要只單純輸出數字,像“(%d)”。
- 研究一下linux/device.h善用下面現成的debug宣告。
- dev_err(), dev_warn(), dev_info()
- pr_debug() and pr_info().
- 用Kconfig options/-DDEBUG來掌控你的debug marco。
- 研究一下VERBOSE_DEBUG/add dev_vdbg(),這是和Kconfig有關的。
Chapter 14: Allocating memory
- 善用kernel提供的memory alloc。
- kmalloc(), kzalloc(), kcalloc(), and vmalloc()
- (tbd)
Chapter 15: The inline disease
- 講了一些在那些狀況下不要用inline。可以好好看一下本文。
- kmalloc()提供一個不錯的範例。
- 其實個人覺得inline是由compiler決定要編成macro或function,這和compiler的版本比較有關係(看compiler寫得好不好)。
Chapter 16: Function return values and names
- 分成 static和 publc function來說,public的要沿用下面規則
- 如果是命令的話(ex. add_work),返回0代表成功;而-EBUSY代表失敗。
- 如果是述語(predicate)的話(ex.pci_dev_present()),1代表成功;0的話是失敗。
- point的話以NULL或ERR_PTR代表成功或失敗。
Chapter 17: Don't re-invent the kernel macros
- 像以下這些現成的Macros就別再自行宣告了。
- ARRAY_SIZE
- FIELD_SIZEOF
- max/min
Chapter 18: Editor modelines and other cruft
- vim/emacs會把編輯器的配置利用註解方式(/* */)嵌入在source code中,記得把它拿掉。以免造成別人的不便。
Appendix I: References
- 最後再丟幾本聖經給你。
- The C Programming Language, Second Edition
- The Practice of Programming
- GNU manuals
- WG14
- Kernel CodingStyle