C語言「超級喜歡」縮寫——《例C》(四)

題圖:ASR-33 Teletype

stdio是standard input/output的縮寫,stdlib是standard library的縮寫,printf是print formatting的縮寫……那為什麼C語言這麼喜歡縮寫呢?

本章任務

基於上一章的示例代碼,嘗試聲明兩個標識符相同但類型不同的變數。觀察編譯器提供的錯誤信息。

自定義標識符的命名原則

自定義標識符(程序代碼中的常量、變數、函數、類型等)的命名是有規律可循的。

駝峰命名法

如果一個標識符包含兩個英語單詞,則兩個單詞間不使用下劃線區分,而是將後一個單詞的首字母大寫。例如

  • networkConnect
  • readFile
  • cloneObject
  • showTerminalResult

Pascal命名法

Pascal命名法也叫大駝峰命名法,在駝峰命名法的基礎上將第一個首字母大寫。例如

  • CreateThread
  • DrawInterface
  • FunctionPointer
  • UniversityTeacher

匈牙利命名法

這個方法不推薦使用,看看就好。

在形式上類似於駝峰命名法,不過在單詞前面加上前綴。前綴表示數據類型的是系統匈牙利命名法,前綴表示數據的目的的是應用匈牙利命名法。

系統匈牙利命名法示例:

  • lStudentIdentifier表示這個數據的類型是long
  • strName表示這個數據的類型是字元串
  • u8Byte表示這個數據的類型是無符號8位整數

應用匈牙利命名法示例:

  • rwPos表示這是一個橫坐標
  • cbBlock表示這是一個塊所佔的位元組數

現在基本沒什麼人用匈牙利命名法了,因為IDE可以幫助我們檢查類型,靠短小的前綴也沒法判斷該數據的意義。

C語言的命名原則

如果你追求100%標準的話,就遵守吧(筆者覺得沒必要)

一般C語言標準庫的標識符都是縮寫,比如

  • printf是print formatting的縮寫
  • stdio是standard input/output的縮寫
  • stdlib是standard library的縮寫
  • strcpy是string copy的縮寫(標準庫string的一個函數名)

宏用大寫字母和下劃線,比如之前的PAUSE

常量也用全大寫字母和下劃線(另外宏的一個功能是定義常量)。

標識符命名還有「潛規則」:不要在自定義標識符前面加兩個下劃線,因為那些標識符一般是被編譯器或標準庫實現的標識符(類型或屬性標識符,屬於編譯器擴展語法的一部分),比如__cplusplus或__declspec。他們這麼干就是為了防止標識符衝突。

C語言的標識符衝突問題

那麼為什麼會標識符衝突呢?因為C語言中,不允許把一個標識符和不同的類型綁定。比如當程序使用了printf函數時,標識符printf就作為函數類型的標識符。那麼程序員就不能把printf標識符和某個量綁定了。

隨著程序規模的日益龐大,類似的衝突會越來越多。甚至標準庫會為了防止標識符衝突,做出搞笑的標識符來。例如C11的thrd_create。

所以C++引入了namespace(命名空間)來解決這個問題。

標識符縮寫

之前看到了C語言的一些標準庫的標識符,大量使用縮寫。我們再來看看Unix的標識符:

  • cd這個應該見得多
  • ls這個也還好
  • pwd ???
  • sbrk ???
  • usr ???
  • dirent ???

MDZZ(掀桌

為什麼編寫C語言和Unix系統的人這麼喜歡縮寫??因為當時的鍵盤太爛了。有多爛呢,大概比New MacBook的鍵盤還要爛兩倍。

含糊的命令名

UNIX新手總是對UNIX對命令的命名表示驚訝。在DOS和Mac上受的教育不足以讓他們體會到cp、rm、ls這類兩字母命令的簡潔和優美。

像我們這樣用過70年代早期的IO設備的人都能理解,ASR-33 Teletype這類設備的速度、可靠性,以及它的鍵盤是萬惡之源。和今天這種基於反饋原理、只需要關閉一個微開關的鍵盤不同,你必須用足力氣撳下Teletype的鍵至少半英寸,以發動一個類似自行車上用的小型發電機,在上面操作要冒指骨骨折的危險。

如果當時Dennis和Ken用的是Selectric而不是Teletype,可能今天我們敲的將不是」cp」和」rm」而是」copy」和」remove」了。(Ken Thompson曾被問道如果他能重新設計UNIX他將做什麼修改,他回答說:「我會在creat命令後加上個e。」),科技在拓寬我們的選擇的同時,也能限制我們的選擇,此一例也。

20多年過去了,還有什麼理由延續這一傳統呢?理由就是「歷史的無可替代的力量」,歷史就是那些存在的代碼和教科書。如果一個廠商用remove替代了rm,那麼所有UNIX教科書就不適用於這一系統了,每個使用rm的shell腳本都需要被修改。而且這也不合POSIX標準。

摘自《UNIX痛恨者手冊》

除了鍵盤太糟糕之外,當時的顯示器只能在一行顯示80個字元也是原因之一。造成了C和Unix的標識符被「往死命地縮寫」。


推薦閱讀:

TAG:C編程語言 | C語言入門 | 編程入門 |