宏如何与我的C代码中的整数和char不同

时间:2019-06-07 15:24:46

标签: c if-statement macros c-preprocessor conditional-compilation

我对使用“ 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

1 个答案:

答案 0 :(得分:3)

宏条件条件中无法进一步扩展为整数(不是宏)的令牌将替换为0。

6.10.1p4

  

在评估之前,预处理列表中的宏调用   将成为控制常量表达式的标记是   替换(由定义的一元变量修改的那些宏名称除外)   运算符),就像普通文本一样。如果定义的令牌已生成   由于此替换过程或使用定义的一元   运算符与宏之前的两个指定格式之一不匹配   替换,行为是不确定的。由于所有更换后   宏扩展和已定义的一元运算符已执行,   所有剩余的标识符(包括与   关键字)替换为pp-number 0 ,然后每个   预处理令牌将转换为令牌。结果代币   组成被评估的控制常数表达式   根据6.6的规则。

由于在您的第二个代码段中都没有定义XY,因此它等效于:

#if 0 == 0
#define Y 3
#else
#define Y 5
#endif

自然会解析到第一个分支。