2012年4月14日 星期六

C語言:函式的Coding-style

傳統上,我們學C語言的時候,大多使用的寫法方式大多如下:
int main(int argc,char **argv)
{
 ... 
}

會直接把傳進函數的參數的type與名稱打在函式名稱右邊的小括弧中。

也因此,有些人的Coding-style,會傾向把函式的左括弧和函式名稱放在同一行,就例如這樣:
int main(int argc,char **argv) {
 ... 
}

這樣的寫法並不違背C語言的語法,拿去編譯器編譯也當然會過,說實在的如果只是寫給自己看、或是工作的環境並沒有特別指定Coding-style的話,只要自己習慣並沒有什麼不好。

然而,如果開發OpenSource相關專案的人,或多或少都會和開源社群交流,也會去trace甚至更改Source code,在這樣的狀況下,規範一個固定的Coding-style實屬必要。以Linux社群為例,就有著一份 "Documentation/CodingStyle and Beyond" (http://kernel.org/doc/ols/2002/ols2002-pages-250-259.pdf) 來約束大家的Coding-style,以便其他完全素昧平生的開發者,也能輕易的(?)看懂你寫的原始碼。

在"Documentation/CodingStyle"這篇文章當中,對函式寫法的標準是:
int foo(int x)
{
 ... 
}

一開始我在看到這段的時候,覺得只是一個換行符號的差別,僅是社群內自行約束的習慣而已,並不以為意。

然而,後來因緣際會看到一些特殊的函式寫法例子之後,就覺得將左括弧換行是有其必要性,我們來看一個例子:
int main(argc,argv)
    int argc;
    char **argv;
{
 ... 
}

上面的程式碼是在GNU Bash當中,實作printenv指令時,main function的寫法。從上面我們可以看到,他在函式名稱旁邊的小括弧當中,其傳遞進函式的參數,僅將其名字列出,並不指定type,而是換行之後才將其宣告寫入,最後再換行打入左大括號。

初次看到此種寫法之時,會以為這個寫法是有問題的,但將此種寫法拿去編譯器編譯,並不會出現問題,此種寫法是早期C語言的寫法,而在此寫法中,函式變數旁的小括弧和負責包住函式本體的大括弧中間,確實有可能出現其他內容,甚至有換行之必要,故在此寫法下,會希望負責包住函式本體的左大括弧,和括住傳入函式參數的小括弧中間有需要換行,而此習慣便延續到現在Linux kernel的Coding-style當中。



Creative Commons Licence

沒有留言:

張貼留言