問
:如何在原始檔中合理分配函式?
答:通常,相關的函式放在同乙個檔案中。有時候(例如開發庫的時候),乙個原始檔(自然也
就是乙個目標檔案)放乙個函式比較合適。有時候,尤其是對某些程式設計師,太多的原始檔可能 會很麻煩,將多數以至所有的程式都放入少數幾個大的原始檔中也很誘人,甚至也是合適的。 希望用
static
關鍵字限制某些函式或全域性變數的作用域時,原始檔的分配就有更多限制了:靜 態函式和變數以及共享它們的函式都必須在同乙個原始檔中。 問:
用if(!strcmp(s1, s2))
比較兩個字串是否相等是個好風格嗎?
答:這並不是個很好的風格,儘管這是個流行的習慣用法。如果兩個字串相等,這個測試返回
真,但!
(「非」)的使用容易引起誤會,以為測試
不相等情況。 另乙個選擇是定義乙個巨集:
#define streq(s1, s2) (strcmp((s1), (s2)) == 0)然後這樣使用:
if(streq(s1, s2))另一種選擇(可以防止巨集的濫用,參見問題
10.2
)是定義
#define strrel(s1, op, s2) (strcmp(s1, s2) op 0)然後你可以這樣使用:
if(strrel(s1, ==, s2)) ...問if(strrel(s1, !=, s2)) ...
if(strrel(s1, >=, s2)) ...
:為什麼有的人用
if(0 == x)
而不是if(x == 0)? 答
:這是用來防止乙個常見錯誤的小技巧:
if(x = 0)
如果你養成了把常量放在
==前面的習慣,那麼當你意外地把**寫成了:
if(0 = x)
編譯器就會報錯。顯然,一些人會覺得記住倒轉測試比記住輸入兩個
=號容易。(的確,就 算是經驗老道的程式設計師有時也會錯把
==寫成
=。)當然這個技巧只對和常量比較的情況有用。
另一方面,有的人又覺得這樣倒轉的測試既難看又影響注意力,因而提出應該讓編譯器 對
if(x = 0)
報警。(實際上,很多編譯器的確對條件式中的賦值報警,當然如果你真的需 要,你總是可以寫
if((x = expression))
或if((x = expression)!= 0)。 問
:為什麼有些**在每次呼叫
printf
前增加了型別轉換
(void)? 答
:printf
確實有返回值(輸出的字元個數或錯誤碼),但幾乎沒有誰會去檢驗每次呼叫的返
回值。由於有些編譯器和
lint
對於被丟棄的返回值會報警告,顯式地用
(void)
作型別轉換相當 於說:「我決定忽略這次呼叫的返回值,請繼續對於其他(也許不慎)忽略返回值的情況提出 警告」。通常,
(void)
型別轉換也用於
strcpy
和strcat
的呼叫,它們的返回值從沒有什麼驚 人之處。
C 程式設計風格約定
我一直自認為,自己在程式設計功力還算說的過去,昨天乙個老師看了我以前寫的 說功力還需加強 當時我很鬱悶,其實我知道的可能還比他多 很多時候我們 都太注重高水平 尖端的技術,其實很多公司叫你寫一段簡單的程式,可能就會決定要不要你。他們是從 中看出了你的閱歷,你的水平。這些水平不是體現你的 尖端技術 況...
C 程式設計風格約定
參考 net設計規範 krzysztof cwalina,brad abrams著 1 必須是實際開發人員使用的約定。為了實現這個目標,我們審查了由.net框架的開發人員編寫的 有些約定並未在框架中普遍應用,對此我們不予採納。2 約定應該盡可能的合理 簡潔。我們認為只要不犧牲 的可讀性,在更少的行數...
C 程式設計風格約定
我一直自認為,自己在程式設計功力還算說的過去,昨天乙個老師看了我以前寫的 說功力還需加強 當時我很鬱悶,其實我知道的可能還比他多 很多時候我們 都太注重高水平 尖端的技術,其實很多公司叫你寫一段簡單的程式,可能就會決定要不要你。他們是從 中看出了你的閱歷,你的水平。這些水平不是體現你的 尖端技術 況...