我对一个简单的测试有一点小问题:我有一个三级,LOG
,DEBUG
和ERROR
的记录器。在编译时,我使用需要的值之间的按位或操作来定义级别错误。但当我尝试用接收到的类型消息测试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/