gpt4 book ai didi

c++ - 如何在宏中使用 vsprintf/vsnprintf?

转载 作者:行者123 更新时间:2023-11-30 02:08:35 29 4
gpt4 key购买 nike

我正在尝试编写一个宏来简化 LOG4CPLUS 的使用。但是我在写宏的时候遇到了一些麻烦。

这是我的 cpp 文件中的内容:

Logger logger = Logger::getInstance("ManagerServer");

之后,我可以这样记录一行:

LOG4CPLUS_ERROR(logger, logEvent);

我只想写一个宏,而不是我可以将 logEvent 更改为一些变量参数。并像这样使用:

LogErr("failed");
LogErr("failed times %d", iTimes);

所以,我这样写:

#define LogErr(fmt, args...)\
do {\
char szBuf[MAX_LOG_BUFFER_SIZE];\
memset(szBuf, 0, MAX_LOG_BUFFER_SIZE); \
vsnprintf(szBuf, MAX_LOG_BUFFER_SIZE, fmt, ##args); \
LOG4CPLUS_ERROR(logger, szBuf);\
} while(0)

但是当我编译的时候。 g++ 给我这条信息:

error: expected primary-expression before ')' token

有人能帮帮我吗?我真的很感激。

最佳答案

糟糕... C 标签已被删除

问题出在没有提供足够参数时宏的扩展 (LogErr("failed"))。这在 C 中不起作用。

尝试添加一个虚拟参数

LogErr("failed", 0);
/* or better */
LogErr("%s", "failed");

此外,您不能像您尝试的那样在宏中使用 v* 函数:预处理器不知道变量参数,也无法创建类型为 va_list 的对象>.


在 C99 中,一种实现您想要做的事情的方法是

#include <stdio.h>
#include <string.h>

#define MAX_LOG_BUFFER_SIZE 100

#define LogErr(fmt, ...) \
do { \
char szBuf[MAX_LOG_BUFFER_SIZE]; \
memset(szBuf, 0, MAX_LOG_BUFFER_SIZE); \
snprintf(szBuf, MAX_LOG_BUFFER_SIZE, fmt, ##__VA_ARGS__); \
/* LOG4CPLUS_ERROR(logger, szBuf); */ \
} while(0)

int main(void) {
LogErr("err %d", 4);
/*LogErr("failed");*/
LogErr("%s", "failed");
return 0;
}

注:snprintf##__VA_ARGS

关于c++ - 如何在宏中使用 vsprintf/vsnprintf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6478072/

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