我熟悉用"C“语言编写宏的条件编译,但有些代码让我感到困惑,我可以理解代码-1的工作原理,没有任何东西分配给X,因此Y被定义为5(其他条件),在打印Y时,我们将得到5作为输出。
但是在CODE-2中,它非常类似于CODE-1,除了"#if X == A"条件,它将输出作为3,我不明白它如何能像3 .Can那样产生输出。
"#if X == 3"和
"#if X == A"`使输出不同。
代码-1
#include <stdio.h>
#if X == 3
#define Y 3
#else
#define Y 5
#endif
int main()
{
printf("%d", Y);
return 0;
}
//output : 5代码-2
#include <stdio.h>
#if X == A
#define Y 3
#else
#define Y 5
#endif
int main()
{
printf("%d", Y);
return 0;
}
//output : 3我希望
CODE-2的输出是5,但实际输出是3。
发布于 2019-06-07 15:54:20
宏条件中不能进一步扩展到整数(不是宏)的标记将被0替换。
6.10.1p4
在计算之前,将替换将成为控制常量表达式的预处理标记列表中的宏调用(除了那些被定义的一元运算符修改的宏名称),就像在普通文本中一样。如果定义的令牌是由于此替换过程或使用定义的一元运算符而生成的,则在宏替换之前不匹配这两种指定表单中的一种,则行为未定义。在执行了宏展开和定义的一元操作符的所有替换之后,所有剩余的标识符(包括与关键字在词汇上相同的标识符)被替换为pp-数字0,然后每个预处理令牌被转换为一个令牌。生成的令牌组成控制常量表达式,该表达式根据6.6的规则计算。
由于在第二个代码段中既没有定义X,也没有定义Y,因此它等同于:
#if 0 == 0
#define Y 3
#else
#define Y 5
#endif自然地决定到第一个分支。
https://stackoverflow.com/questions/56497228
复制相似问题