gpt4 book ai didi

使用类函数宏编译错误

转载 作者:行者123 更新时间:2023-12-01 12:48:18 24 4
gpt4 key购买 nike

海湾合作委员会 4.7.2 c89

你好,

我正在进行一些维护工作,我有以下类似函数的宏:

#define GET_ERROR() ((errno == 0) ? "None" : strerror(errno))

#define LOG_ERR(fmt, ...) \
fprintf(stderr, "[ERROR] %s:%d: error [%s] " fmt "\n", __func__, __LINE__, GET_ERROR(), ##__VA_ARGS__)

#define LOG_ASSERT(ARG, fmt, ...) do { \
if(!(ARG)) { \
char arg_fmt[512]; \
snprintf(arg_fmt, sizeof arg_fmt, "%s, ", #ARG); \
strcat(arg_fmt, fmt); \
LOG_ERR(arg_fmt, ##__VA_ARGS__); \
errno = 0; \
abort(); \
} \
} while(0)

LOG_ASSERT 将模拟断言函数。但会包含来自 strerror errno 的一些额外信息。

我是这样使用的:

LOG_ASSERT(msg_id != -1, "Failed to connect to the message queue [ %d ]", msg_id);

所以它应该像这样显示:

"msg_id != -1, Failed to connect to the message queue [ -1 ]"

我使用 strcat 在 fmt 的开头添加了前缀“msg_id != -1”。

但是,我遇到了这些似乎无法修复的编译错误。我认为这很简单,如果我遗漏了一些简单的东西,我只想得到另一个想法。

error: expected ‘)’ before ‘arg_fmt’
warning: format ‘%s’ expects a matching ‘char *’ argument [-Wformat]
warning: format ‘%d’ expects a matching ‘int’ argument [-Wformat]
warning: format ‘%s’ expects a matching ‘char *’ argument [-Wformat]

我知道有些人可能不同意这个宏,但这是我必须维护的。

非常感谢任何建议

最佳答案

据我所知,您只能连接常量字符串文字,而不能连接字符数组,这是您的问题:

fprintf(stderr, "[ERROR] %s:%d: error [%s] " fmt "\n", __func__, ....

fmt 是一个字符数组,您需要另一个缓冲区来复制格式,或者您可以拆分 printf

#define LOG_ERR(fmt, ...)                                               \
fprintf(stderr, "[ERROR] %s:%d: error [%s] ", __func__, __LINE__, GET_ERROR());\
fprintf(stderr, fmt, ##__VA_ARGS__)

关于使用类函数宏编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14020351/

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