首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >宏如何与C代码中的整数和char工作不同

宏如何与C代码中的整数和char工作不同
EN

Stack Overflow用户
提问于 2019-06-07 15:24:46
回答 1查看 73关注 0票数 1

我熟悉用"C“语言编写宏的条件编译,但有些代码让我感到困惑,我可以理解代码-1的工作原理,没有任何东西分配给X,因此Y被定义为5(其他条件),在打印Y时,我们将得到5作为输出。

但是在CODE-2中,它非常类似于CODE-1,除了"#if X == A"条件,它将输出作为3,我不明白它如何能像3 .Can那样产生输出。

代码语言:javascript
复制
 "#if X == 3"

代码语言:javascript
复制
"#if X == A"`

使输出不同。

代码-1

代码语言:javascript
复制
#include <stdio.h>
#if X == 3
#define Y 3
#else
#define Y 5
#endif

int main()
{
  printf("%d", Y);
  return 0;
}

//output : 5

代码-2

代码语言:javascript
复制
#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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-07 15:54:20

宏条件中不能进一步扩展到整数(不是宏)的标记将被0替换。

6.10.1p4

在计算之前,将替换将成为控制常量表达式的预处理标记列表中的宏调用(除了那些被定义的一元运算符修改的宏名称),就像在普通文本中一样。如果定义的令牌是由于此替换过程或使用定义的一元运算符而生成的,则在宏替换之前不匹配这两种指定表单中的一种,则行为未定义。在执行了宏展开和定义的一元操作符的所有替换之后,所有剩余的标识符(包括与关键字在词汇上相同的标识符)被替换为pp-数字0,然后每个预处理令牌被转换为一个令牌。生成的令牌组成控制常量表达式,该表达式根据6.6的规则计算。

由于在第二个代码段中既没有定义X,也没有定义Y,因此它等同于:

代码语言:javascript
复制
#if 0 == 0
#define Y 3
#else
#define Y 5
#endif

自然地决定到第一个分支。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56497228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档