C語言中typedef用法的疑惑——解惑公佈版

Mr.P發表於2014-02-01

說明:下文引用的經典書籍K&R的《The C Programming Language》是中文版•新版第二版,由機械工業出版社發行,中文書名為《C語言程式設計》,譯者:徐寶文 李志 ; 審校:尤晉元

特別說明:函式型別與函式指標、函式返回值型別是不同概念

最近回顧C語言的語法結構時,對typedef的用法相當的困惑:來自於經典與實踐兩個方面的衝突。

相信學過C語言的,都知道K&R的《The C Programming Language》這本著作吧,其中位於參考手冊第203頁上數下第8、9行指出:特別是,不能通過typedef定義函式型別。也就是說如下程式碼是不合法的:

typedef int hsm(Void);

但是我將程式碼輸入編譯器編譯除錯執行時,語法檢查器並沒有指出錯誤資訊,程式執行正常。

在上面的typedef定義函式型別hsm後,就可以如下使用:

hsm * p;//定義了一個指向該函式型別的指標p//

經過除錯也沒有任何警告與錯誤的資訊。

網上的有些資料也指出typedef是可以定義函式型別,加上自己實際上機驗證也確實沒有錯誤,也許編譯器的語法支援不同,有些編譯器可能不支援;但是經典的K&R真是字字需要琢磨,句句需要詳細解析才能夠理解透徹,本人不敢輕易就下結論。作者之所以特別的指出,不能通過typedef定義函式型別,必有其緣由。本人知識水平有限,暫時無法明白作者為什麼這樣特別的指出。

今天終於解通這個問題:typedef屬於儲存類說明符,函式在定義時就只有並必須有extern與static兩種之間一種的儲存連結,所以像這樣的宣告:typedef int hsm(Void);在語法上是不合法的;之所以能夠在編譯語法檢查時沒有發出警告與錯誤,只能說明現在的編譯器都比較人性化,他能夠忽略一些簡單的不會導致重大問題的錯誤,並且按照它定義的方法直接解決這個錯誤,所以對於程式設計師來說就能夠把注意力放在更加重要的問題思考上。

相關文章