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

古代的剑客们与

对手相逢时,无

论对手多么强大,

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

读者:我怎样构造比较字符串的 #if 预处理表达式?

小林;你不能直接这样做; #if 预处理指令只处理整数。有一种替代的方法是定义多个整数值不一样的宏, 用它们来实现条件比较。

读者:sizeof 操作符可以用于 #if 预编译指令中吗?

小林:不行。预编译在编译过程的早期进行, 此时尚未对类型名称进行分析。作为替代, 可以考虑使用 ANSI 的 <limits.h> 中定义的常量, 或者使用 “配置”(configure) 脚本。更好的办法是, 书写与类型大小无关的代码。

读者:我可以在 #include 行里使用 #ifdef 来定义两个不同的东西吗?

小林:不行。你不能 “让预处理器自己运行”。你能做的就是根据 #ifdef 设置使用两个完全不同的单独 #define 行之一。

读者:对typdef 的类型定义有没有类似 #ifdef的东西?

小林:不幸的是, 没有。你必须保存一套预处理宏 (如 MY TYPE DEFINED) 来记录某个类型是否用 typdef 声明了。

读者:我如何用 #if 表达式来判断机器是高字节在前还是低字节在前?

小林:恐怕你不能。(预处理运算仅仅使用长整型, 而且没有寻址的概念。) 你是否真的需要明确知道机器的字节顺序呢,通常写出与字节顺序无关的代码更好。

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

——图灵