十年老IT知识分享 – 基础知识 | 每日一面(72)

古代的剑客们与

对手相逢时,无

论对手多么强大,

明知不敌,也要亮出自己的剑!

读者:为什么在我用 #ifdef 去掉的代码里出现了奇怪的语法错误?

小林:在 ANSI C 中, 被 #if, #ifdef 或 #ifndef “关掉” 的代码仍然必须包含 “合法的预处理符号”。这意味着字符 ” 和 ’ 必须像在真正的 C 代码中那样严格配对, 且这样的配对不能跨行。特别要注意缩略语中的撇号看起来很像字符常量的开始。因此, 自然语言的注释和伪代码必须写在 “正式的” 注释分界符 /* 和 */ 中。

读者:#pragma 是什么, 有什么用?

小林:#pragam 指令提供了一种单一的明确定义的 “救生舱”, 可以用作各种 (不可移植的) 实现相关的控制和扩展: 源码表控制、结构压缩、警告去除 (就像 lint 的老 /* NOTREACHED */ 注释), 等等。

读者:#pragma once” 是什么意思?我在一些头文件中看到了它。

小林:这是某些预处理器实现的扩展用于使头文件自我识别; 它跟前面讲到的 #ifndef 技巧等价, 不过移植性差些。

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

——图灵

正文完