如何在宏中使用vsprintf / vsnprintf?

| 我正在尝试编写一个宏来简化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 ++给我这个信息:   错误:\')\'令牌之前的预期主表达式 有谁能帮助我吗?对此,我真的非常感激。     
已邀请:
        糟糕... C标签已被移除 问题是当没有提供足够的参数时(the4ѭ)宏扩展。这在C中不起作用。 尝试添加虚拟参数
LogErr(\"failed\", 0);
/* or better */
LogErr(\"%s\", \"failed\");
同样,您也不能像尝试那样在宏内使用
v*
函数:预处理器不了解变量参数,因此广告无法创建type7ѭ类型的对象。 在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
    
        您在args参数后缺少逗号。
#define LogErr(fmt, args, ...)\\
                        ^
另外,我不知道g ++当前是否支持可变参数宏,它是C ++ 11的功能。 (不过,我相信C编译器支持它们)。     
        多亏了pmg,Ferruccio和大家。你们真的救了我! 这些代码在我的PC上运行良好。似乎我确实错过了vsnprintf和snprintf。
#define Log(fmt, args...) \\
    do {\\
        char szBuf[MAX_LOG_BUFFER_SIZE];\\
        snprintf(szBuf, MAX_LOG_BUFFER_SIZE-1, fmt, ##args);\\
        LOG4CPLUS_ERROR(logger, szBuf);\\
    } while(0)

int main() {
    Log(\"Hello macro.\");
    Log(\"Hello macro %d\", 1);
    Log(\"Hello macro %s, %d\", \"foo\", 2);

    return 0;
}
再次感谢!     
        Log4cplus的最新版本(1.1.0+)支持使用printf样式的宏进行日志记录。您在OP中的示例如下所示:
LOG4CPLUS_ERROR_FMT(logger, \"failed\");
LOG4CPLUS_ERROR_FMT(logger, \"failed times %d\", iTimes);
如果您仍想以其他方式重新实现,请参阅loggingmacros.h以获取实现详细信息。     

要回复问题请先登录注册