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的標識符被「往死命地縮寫」。
推薦閱讀: