第一章:縮進格式 Tab是
個字符
於是縮進也是
個字符
有很多怪異的風格
他們將縮進格式定義為
個字符(設置為
個字符!)的深度
這就象試圖將PI定義為
一樣讓人難以接受
理由是:縮進的大小是為了清楚的定義一個塊的開始和結束特別是當你已經在計算機前面呆了多個小時了以後你會發現一個大的縮進格式使得你對程序的理解更容易
現在有一些人說使用個字符的縮進使得代碼離右邊很近在個字符寬度的終端屏幕上看程序很難受回答是但你的程序有個以上的縮進的時候你就應該修改你的程序
總之個字符的縮進使得程序易讀還有一個附加的好處就是它能在你將程序變得嵌套層數太多的時候給你警告這個時候你應該修改你的程序
第二章:大符號的位置
另外一個C程序編程風格的問題是對大括號的處理同縮進大小不同幾乎沒有什麼理由去選擇一種而不選擇另外一種風格但有一種推薦的風格它是Kernighan和Ritchie的經典的那本書帶來的它將開始
的大括號放在一行的最後而將結束大括號放在一行的第一位如下所示:
if (x is true) { we do y }
然而還有一種特殊的情況:命名函數:開始的括號是放在下一行的第一位如下:
int function(int x) { body of function }
所有非正統的人會非難這種不一致性但是所有思維正常的人明白: (第一) K&R是___對___的(第二)如果K&R不對請參見第一條 (:))另外函數也是特殊的不一定非得一致
需要注意的是結束的括號在它所占的那一行是空的__除了__它跟隨著同一條語句的繼續符號如while在dowhile循環中或者else在if語句中如下:
do { body of doloop } while (condition);
以及
if (x == y) { } else if (x > y) { } else { }
理由: K&R
另外注意到這種大括號的放置方法減小了空行的數量但卻沒有減少可讀性於是在屏幕大小受到限制的時候你就可以有更多的空行來寫些注釋了
第三章:命名系統
C是一種簡潔的語言那麼命名也應該是簡潔的同MODULE以及ASCAL語言不同的是C程序員不使用諸如ThisVariableIsATemporaryCounter之類的命名方式一個C語言的程序員會將之命名為tmp這很容易書寫且並不是那麼難以去理解
然而當混合類型的名字不得不出現的時候描述性名字對全局變量來說是必要的了調用一個名為foo全局的函數是很讓人惱火的全局變量(只有你必須使用的時候才使用它) 就象全局函數一樣需要描述性的命名方式假如你有一個函數用來計算活動用戶的數量你應該這樣命名count_active_users()或另外的相近的形式你不應命名為cntusr()
有一種稱為Hungarian命名方式它將函數的類型編碼寫入變量名中這種方式是腦子有毛病的一種表現編譯器知道這個類型而且會去檢查它而這樣只會迷惑程序員 知道為什麼Micro$oft為什麼會生產這麼多臭蟲程序了把!!
局部變量的命名應該短小精悍假如你有一個隨機的整數循環計數器它有可能有i如果沒有任何可能使得它能被誤解的話將其寫作loop_counter是效率低下的同樣的tmp可以是任何臨時數值的函數變量
如果你害怕混淆你的局部變量的名字還有另外一個問題就是稱
functiongrowthhormoneimbalancesyndrome
第四章:函數
函數應該短小而迷人而且它只作一件事情它應只覆蓋一到兩個屏幕(*一屏)並且只作一件事情而且將它做好(這不就是UNIX的風格嗎譯者注)
一個函數的最大長度和函數的復雜程度以及縮進大小成反比於是如果你已經寫了簡單但長度較長的的函數而且你已經對不同的情況做了很多很小的事情寫一個更長一點的函數也是無所謂的
然而假如你要寫一個很復雜的函數而且你已經估計到假如一般人讀這個函數他可能都不知道這個函數在說些什麼這個時候使用具有描述性名字的有幫助的函數
另外一個需要考慮的是局部變量的數量他們不應該超過個否則你有可能會出錯重新考慮這個函數將他們分割成更小的函數人的大腦通常可以很容易的記住件不同的事情超過這個數量會引起混亂你知道你很聰明但是你可能仍想去明白周以前的做的事情
第章:注釋
注釋是一件很好的事情但是過多的注釋也是危險的不要試圖區解釋你的代碼是注釋如何如何的好:你應該將代碼寫得更好而不是花費大量的時間去解釋那些糟糕的代碼
通常情況下你的注釋是說明你的代碼做些什麼而不是怎麼做的而且要試圖避免將注釋插在一個函數體裡:假如這個函數確實很復雜你需要在其中有部分的注釋你應該回到第四章看看你可以寫些簡短的注釋來注明或警告那些你認為特別聰明(或極其丑陋)的部分但是你必須要避免過多取而代之的是將注釋寫在函數前告訴別人它做些什麼事情和可能為什麼要這樣做
第六章:你已經深陷其中了
不要著急你有可能已經被告之GUN emacs會自動的幫你處理C的源代碼格式而且你已經看到它確實如此但是缺省的情況下它的作用還是不盡如人意(實際上他們比隨便敲出來的東西還要難看 ainfinite number of monkeys typing into GNU emacs would never make a good program)
於是你可以要麼不要使用GUN emacs要麼讓它使用sanervalules使用後者你需要將如下的語句輸入到你的emacs文件中(defun linuxcmode() C mode with adjusted defaults for use with the Linux kernel(interactive) (cmode) (csetstyleK&R) (setq cbasicoffset))
這會定義一個Mx Linuxcmode的命令當你hacking一個模塊的時候如何你將* linuxc *輸入在最開始的兩行這個模式會自動起作用而且你也許想加入如下
(setq automodealist (cons (/usr/src/linux*/*\\〖ch〗$ linuxcmode) automodealist))
到你的emacs文件中這樣的話當你在/usr/src/linux下編輯文件的時候它會自動切換到linuxcmode
但是假如你還不能讓emaces去自動處理文件的格式不要緊張你還有一樣東西: 縮進
GNU的縮進格式也很死板這就是你為什麼需要加上幾行命令選項然而這還不算太壞因為GNU縮進格式的創造者也記得K&R的權威 (GNU沒有罪他們僅僅是在這件事情上錯誤的引導了人們) 你要做的就只有輸入選項kr i(表示K&R縮進個字符)
縮進有很多功能特別是當它建議你重新格式你的代碼的時候你應該看看幫助但要記住: 縮進不是風格很差的程序的萬靈丹
From:http://tw.wingwit.com/Article/program/net/201311/13283.html