基础知识 | 每日一面(63)

古代的剑客们与

对手相逢时,无

论对手多么强大,

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

读者:如何列出所有的预定义标识符?

小林:尽管这是种常见的需求, 但却没有什么标准的办法。gcc 提供了和 -E 一起使用的 -dM 选项, 其它编译器也有类似的选项。如果编译器文档没有帮助, 那么可以使用类似 Unix 字符串工具的程序取出编译和预处理生成的可执行文件中的可打印字符串。请注意, 很多传统的系统相关的预定义标识符并不标准, 因而会被删除或改名。

读者:我有些旧代码, 试图用这样的宏来构造标识符 #define Paste(a,b) a/**/b 但是现在不行了。

小林:这是有些早期预处理器实现的未公开的功能, 注释完全消失, 因而可以用来粘结标识符。但 ANSI 确认注释用空白代替。然而对粘结标识符的需求却十分自然和广泛, 因此 ANSI 引入了一个明确定义的标识符粘结操作符 —— ##, 它可以象这样使用#define Paste(a, b) a##b

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

——图灵