C语言宏比较结果异常:为何输出10而非预期的20?
问题:宏条件判断不符合预期的原因
我们通过#define A double将宏A定义为double,预期通过条件宏定义让X的值为20,但实际运行后输出结果为10,这是为什么?
对应的代码如下:
#define A double #if A == float #define X 10 #elif A == double #define X 20 #endif int main() { return X; }
原因分析
C预处理器处理#if这类条件编译指令时,会把未定义的标识符直接解析为0。这里的float和double都是C语言的关键字,但它们并不是预定义的宏常量,所以在条件判断中:
A被替换为double,此时#if A == float就变成了#if double == float- 由于
double和float都没有被定义为宏,预处理器会把它们都当作0处理,条件0 == 0成立,于是X被定义为10,后面的#elif分支不会执行。
解决方法
如果要通过宏实现这类类型相关的条件判断,需要用自定义的宏常量来标识类型,比如:
// 自定义宏标识不同类型 #define TYPE_FLOAT 1 #define TYPE_DOUBLE 2 #define A TYPE_DOUBLE #if A == TYPE_FLOAT #define X 10 #elif A == TYPE_DOUBLE #define X 20 #endif int main() { return X; }
这样预处理器就能正确识别宏的值,执行预期的分支,最终X会被定义为20。
内容的提问来源于stack exchange,提问作者Curious
相关产品推荐
相关产品推荐

