Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C或#define和int之间的位_C - Fatal编程技术网

C或#define和int之间的位

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

我在一个简单的测试中遇到了一个小问题:我有一个具有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("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.谢谢!