基礎知識 | 每日一面(62)

古代的劍客們與

對手相逢時,無

論對手多麼強大,

明知不敵,也要亮出自己的劍!

讀者:我怎樣構造比較字元串的 #if 預處理表達式?

小林;你不能直接這樣做; #if 預處理指令只處理整數。有一種替代的方法是定義多個整數值不一樣的宏, 用它們來實現條件比較。

讀者:sizeof 操作符可以用於 #if 預編譯指令中嗎?

小林:不行。預編譯在編譯過程的早期進行, 此時尚未對類型名稱進行分析。作為替代, 可以考慮使用 ANSI 的 <limits.h> 中定義的常量, 或者使用 「配置」(configure) 腳本。更好的辦法是, 書寫與類型大小無關的程式碼。

讀者:我可以在 #include 行里使用 #ifdef 來定義兩個不同的東西嗎?

小林:不行。你不能 「讓預處理器自己運行」。你能做的就是根據 #ifdef 設置使用兩個完全不同的單獨 #define 行之一。

讀者:對typdef 的類型定義有沒有類似 #ifdef的東西?

小林:不幸的是, 沒有。你必須保存一套預處理宏 (如 MY TYPE DEFINED) 來記錄某個類型是否用 typdef 聲明了。

讀者:我如何用 #if 表達式來判斷機器是高位元組在前還是低位元組在前?

小林:恐怕你不能。(預處理運算僅僅使用長整型, 而且沒有定址的概念。) 你是否真的需要明確知道機器的位元組順序呢,通常寫出與位元組順序無關的程式碼更好。

有時候,正是那些意想不到之人,成就了無人能成之事。

——圖靈