如何检查#define定义的常量值以实现正确的条件编译?
问题原因及解决方法
你遇到的问题根源很简单:预处理器在处理#if条件时,会把未定义的标识符自动替换成0。你只定义了FRUIT为APPLE,但APPLE本身并没有通过#define赋予任何值,所以预处理器会把FRUIT和APPLE都解析成0,0 == 0自然永远为真——哪怕你后续把FRUIT改成其他未定义的标识符,结果也一样。
解决办法
方法1:给每个水果常量定义明确数值
这是最稳妥的方式,给每种需要区分的水果分配唯一数值,让预处理器能正确完成数值比较:
// 先给每种水果定义专属数值 #define APPLE 1 #define BANANA 2 #define ORANGE 3 // 指定当前水果 #define FRUIT APPLE #if (FRUIT == APPLE) printf("The fruit is an apple!\n"); #elif (FRUIT == BANANA) printf("The fruit is a banana!\n"); #else printf("Unknown fruit!\n"); #endif
方法2:使用#ifdef结合宏定义(适合简单判断场景)
如果只需要判断FRUIT是否指向某个特定标识,可以先给标识定义空宏,再通过defined()检查:
#define APPLE #define BANANA #define FRUIT APPLE #if defined(FRUIT) && defined(APPLE) && (FRUIT == APPLE) printf("The fruit is an apple!\n"); #endif
不过要注意:空宏在预处理器中会被解析为空字符串,如果FRUIT和对比的宏都是空定义,表达式会变成() == (),可能引发编译错误,因此更推荐第一种方法。
内容的提问来源于stack exchange,提问作者Fahrradkette
相关产品推荐
相关产品推荐

