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

古代的劍客們與
對手相逢時,無
論對手多麼強大,
明知不敵,也要亮出自己的劍!
讀者:為什麼在我用 #ifdef 去掉的代碼里出現了奇怪的語法錯誤?
小林:在 ANSI C 中, 被 #if, #ifdef 或 #ifndef 「關掉」 的代碼仍然必須包含 「合法的預處理符號」。這意味着字符 " 和 』 必須像在真正的 C 代碼中那樣嚴格配對, 且這樣的配對不能跨行。特別要注意縮略語中的撇號看起來很像字符常量的開始。因此, 自然語言的注釋和偽代碼必須寫在 「正式的」 注釋分界符 /* 和 */ 中。
讀者:#pragma 是什麼, 有什麼用?
小林:#pragam 指令提供了一種單一的明確定義的 「救生艙」, 可以用作各種 (不可移植的) 實現相關的控制和擴展: 源碼錶控制、結構壓縮、警告去除 (就像 lint 的老 /* NOTREACHED */ 注釋), 等等。
讀者:#pragma once」 是什麼意思?我在一些頭文件中看到了它。
小林:這是某些預處理器實現的擴展用於使頭文件自我識別; 它跟前面講到的 #ifndef 技巧等價, 不過移植性差些。
有時候,正是那些意想不到之人,成就了無人能成之事。
——圖靈