我对使用“ C”语言的宏进行条件编译很熟悉,但是有些代码使我感到困惑,我可以理解CODE-1的工作原理,X没有分配任何内容,因此Y定义为5(其他条件),然后在Y版上输出5。
,但在CODE-2
中与CODE-1
非常相似,除了
"#if X == A"
条件,其输出为3
,我不知道它如何产生3
的输出。谁能告诉我
"#if X == 3"
和
"#if X == A"`
使输出有所不同。
CODE-1
#include <stdio.h>
#if X == 3
#define Y 3
#else
#define Y 5
#endif
int main()
{
printf("%d", Y);
return 0;
}
//output : 5
CODE-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
。
答案 0 :(得分:3)
宏条件条件中无法进一步扩展为整数(不是宏)的令牌将替换为0。
在评估之前,预处理列表中的宏调用 将成为控制常量表达式的标记是 替换(由定义的一元变量修改的那些宏名称除外) 运算符),就像普通文本一样。如果定义的令牌已生成 由于此替换过程或使用定义的一元 运算符与宏之前的两个指定格式之一不匹配 替换,行为是不确定的。由于所有更换后 宏扩展和已定义的一元运算符已执行, 所有剩余的标识符(包括与 关键字)替换为pp-number 0 ,然后每个 预处理令牌将转换为令牌。结果代币 组成被评估的控制常数表达式 根据6.6的规则。
由于在您的第二个代码段中都没有定义X
和Y
,因此它等效于:
#if 0 == 0
#define Y 3
#else
#define Y 5
#endif
自然会解析到第一个分支。