基礎知識 | 每日一面(63)
- 2020 年 4 月 2 日
- 筆記

古代的劍客們與
對手相逢時,無
論對手多麼強大,
明知不敵,也要亮出自己的劍!
讀者:如何列出所有的預定義標識符?
小林:儘管這是種常見的需求, 但卻沒有什麼標準的辦法。gcc 提供了和 -E 一起使用的 -dM 選項, 其它編譯器也有類似的選項。如果編譯器文檔沒有幫助, 那麼可以使用類似 Unix 字元串工具的程式取出編譯和預處理生成的可執行文件中的可列印字元串。請注意, 很多傳統的系統相關的預定義標識符並不標準, 因而會被刪除或改名。
讀者:我有些舊程式碼, 試圖用這樣的宏來構造標識符 #define Paste(a,b) a/**/b 但是現在不行了。
小林:這是有些早期預處理器實現的未公開的功能, 注釋完全消失, 因而可以用來粘結標識符。但 ANSI 確認注釋用空白代替。然而對粘結標識符的需求卻十分自然和廣泛, 因此 ANSI 引入了一個明確定義的標識符粘結操作符 —— ##, 它可以象這樣使用#define Paste(a, b) a##b
有時候,正是那些意想不到之人,成就了無人能成之事。
——圖靈