我对一个简单的测试有一点小问题:我有一个三级,LOGDEBUGERROR的记录器。在编译时,我使用需要的值之间的按位或操作来定义级别错误。但当我尝试用接收到的类型消息测试LEVEL时,它是错误的。5 & 2给我1如果水平是一个常数,但是如果我把LEVEL放在一个int变量中,我没有这个问题。有人知道为什么吗?
以下是logger.h中的定义

#define LOG 1
#define DEBUG 2
#define ERROR 4
#define LEVEL LOG | ERROR

这是logger.c
printf("level %d\n", LEVEL);
printf("type %d\n", type);
int level = LEVEL;
printf("and %d\n", LEVEL & type);
printf("and %d\n", level & type);
printf("and %d\n", 5 & 2);

结果
level 5
type 2
and 1
and 0
and 0

最佳答案

LEVEL的宏定义没有正确括起来。改用这个:

#define LEVEL  (LOG | ERROR)

使用伪定义,下面是如何展开printf语句的:
printf("and %d\n", LEVEL & type);

变成:
printf("and %d\n", LOG | ERROR & type);

解析为:
printf("and %d\n", LOG | (ERROR & type));

不是你想要的。
始终将宏定义括起来:
在展开式中的所有宏参数周围加上括号
在完整表达式周围放上括号,以防止出现与上面类似的优先级错误。

关于c - C或#define和int之间的按位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41817527/

10-11 21:45