#ifndef BOOL
這種寫法很常見,不曉得是誰發明的,根本錯得一塌糊塗:
#ifndef BOOL typedef int BOOL; #endif
然後可恨的是,很多常見的 compiler 居然有支援這種寫法。
2008-11-18 新增:有異曲同工之妙的《Code SOD: The Toggle that Wouldn't》。
這種寫法很常見,不曉得是誰發明的,根本錯得一塌糊塗:
#ifndef BOOL typedef int BOOL; #endif
然後可恨的是,很多常見的 compiler 居然有支援這種寫法。
2008-11-18 新增:有異曲同工之妙的《Code SOD: The Toggle that Wouldn't》。
7 Comments
不懂,頂一下。
To 爆爆王:
這是個蠢到讓許多人無法一眼看出的錯誤,撇開巨集的問題,其中最好笑的就是把 #define 與 typedef 混為一談。typedef 後,下次 #if 或 #ifndef 仍然是沒有 define BOOL.
我看了這三行好久, 一直搞不懂這三行要幹嘛..
最後不知為何雄雄懂了這三行原本想要做的事.
這...這也太..
這是 C Preprocessor 必須支援的語法,而且以後用 BOOL 的地方會當成 int (假設沒有 #define BOOL ...),所以 compiler 沒有投訴。
To Arlo
>>原本想要做的事
#ifndef BOOL
#define BOOL int
#endif
or
typedef int BOOL;
啊?哪一個部份是 C Preprocessor 必須支援的語法?
按照合理的前置處理的角度,應該沒有辦法得知是否進行過 typedef (因為還沒有實際進行編譯 typedef)。
但有些編譯器確實可以...我還真有遇到過,例如 C51 即是。而且剛學時,還傻傻的相信這樣寫是對的。
個人認為要做到以下兩個習慣:
1、BOOL 字眼是很容易衝突的;除非很有把握能避免名稱污染,否則不要濫用 typedef。以下用 #define 替代 typedef,將上述原程式碼改為:
#ifndef BOOL
#define BOOL int
#endif
這裡所作的事情是一樣的,但機制不同;雖缺點是這樣一來,也亦無法防制別的地方有宣告 typedef int BOOL;,但至少程式碼有效。
2、將所有與編譯環境平台相關的類型定義放在一個專門的標頭檔裡,並且根據編譯需要條件式地包含引用。
Seamus,
用 #define 事情會更慘吧?例如《#define N 3》下面討論裡,我提到的:
如果只有一個 module,就可以這麼搞,但問題是通常會不只一個 module 組成系統,且來源、作者皆不同。
Post a Comment