C或#define和int之间的位
我在一个简单的测试中遇到了一个小问题:我有一个具有3个级别的记录器,C或#define和int之间的位,c,C,我在一个简单的测试中遇到了一个小问题:我有一个具有3个级别的记录器,LOG,DEBUG和ERROR。在编译时,我使用所需值之间的按位or运算来定义级别错误。但是,当我尝试使用收到的类型消息测试级别时,它是错误的5和2给我1,但如果我将级别放入int变量中,则没有此问题。有人知道为什么吗 以下是logger.h中的定义 #define LOG 1 #define DEBUG 2 #define ERROR 4 #define LEVEL LOG | ERROR 这是logger.c printf
LOG
,DEBUG
和ERROR
。在编译时,我使用所需值之间的按位or运算来定义级别错误。但是,当我尝试使用收到的类型消息测试级别时,它是错误的<如果级别为常数,则代码>5和2
给我1
,但如果我将级别
放入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
级别的宏定义未正确插入括号。改用这个:
#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));
不是你想要的
始终将宏定义括起来:
- 在展开式中的所有宏参数周围加上括号
- 在完整表达式的周围加上括号,以防止出现如上所述的优先级错误
您的
级别的宏定义未正确插入括号。改用这个:
#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));
不是你想要的
始终将宏定义括起来:
- 在展开式中的所有宏参数周围加上括号
- 在完整表达式的周围加上括号,以防止出现如上所述的优先级错误
#define LEVEL LOG | ERROR
-->#define LEVEL(LOG | ERROR)
婴儿的第一个宏:#define LEVEL(LOG | ERROR)
为了更好地解释这些注释,预处理器宏是简单的文本替换。您的第一个“和”printf是printf(“和%d\n”,日志|错误和类型)
,您需要的是(LOG | ERROR)&type
事实上,您应该始终将宏定义括起来。哇,太多的答案了,谢谢您的解释@RobertRouhani#define LEVEL LOG | ERROR
-->
#define LEVEL(LOG | ERROR)
婴儿的第一个宏:#define LEVEL(LOG | ERROR)
为了更好地解释这些注释,预处理器宏是简单的文本替换。您的第一个“和”printf是printf(“和%d\n”,日志|错误和类型)
,您需要的是(LOG | ERROR)&type
事实上,您应该始终将宏定义括起来。哇,太多的答案了,谢谢您的解释@RobertRouhani!我会听从你的建议:D.谢谢!我会听从你的建议:D.谢谢!