gpt4 book ai didi

c - #define 宏不识别第二位集

转载 作者:行者123 更新时间:2023-11-30 16:35:52 26 4
gpt4 key购买 nike

我有一个用于记录目的的宏。其代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

#define BIT_IS_SET(mask, bit) ((mask) & (1 << (bit)))

typedef enum {
LOG_STDOUT = 1 << 0,
LOG_STDERR = 1 << 1,
LOG_FATAL = 1 << 2
} LOG_FLAGS;

#define QLOG(flags, fmt, ...) \
do { \
int use_stderr = BIT_IS_SET(flags, LOG_STDOUT) ? 1 : 0; \
int is_fatal = BIT_IS_SET(flags, LOG_FATAL) ? 1 : 0; \
FILE *fdesc = (use_stderr == 1) ? stdout : stderr; \
if (use_stderr == 1) { \
fputs("STDERR: ", fdesc); \
} else { \
fputs("STDOUT: ", fdesc); \
} \
fprintf(fdesc, "[%s]:%d: "fmt"\n", __FILE__, __LINE__, ##__VA_ARGS__); \
if (is_fatal == 1) { \
fputs("aboring...", fdesc); \
fflush(fdesc); \
abort(); \
} \
fflush(fdesc); \
} while (0)

int main()
{
int x = 6,y = 7;
QLOG(LOG_STDOUT, "x=%d, y=%d",x, y);
QLOG(LOG_STDERR, "x=%d, y=%d",x, y);
QLOG(LOG_STDOUT | LOG_FATAL, "x=%d, y=%d", x, y);
return 0;
}

它的第一个参数是位标志(LOG_STDOUTLOG_STDERR),显示打印位置(stdoutstderr) )。这些标志可以与LOG_FATAL结合使用,这表明必须调用abort()。在 main() 函数中给出的测试代码中,此 LOG_FATAL 未被识别为已设置。我的错误在哪里?

最佳答案

这是因为 & 运算符考虑了所有位。

#define BIT_IS_SET(mask, bit) ((mask) & (bit))

你不需要 do/while,括号就足够了。

考虑:

#define BIT_IS_SET(mask, bit) (!!((mask) & (bit)))

最好使用函数而不是宏。该宏可能会使生成的可执行文件膨胀,而函数可以重复使用。

关于c - #define 宏不识别第二位集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48731356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com