C++中的变分宏没有按预期工作

Variadic macro in C++ not working as expected

本文关键字:工作 C++      更新时间:2023-10-16

我正试图允许在C++应用程序中调用类似printf()的日志函数。我找到了这个参考资料,它很好地解释了我想做什么。然而,我没有幸运地在我的应用程序中实现了这个概念。我缩小了它的规模,直到我可以得到最起码的程序来证明这个问题,现在是:

#include <stdarg.h>
#include <stdio.h>
#define logEvent(severity, TAG, fmt, ...) _log_proxy(severity, TAG, fmt"n", ##__VA_ARGS__)
#define log_level_t int

void _log_proxy(log_level_t severity, const char * TAG, const char *fmt, ...)
        __attribute__((format (printf, 3, 4)));
int main (int argc, const char * argv[]) {
    logEvent(1, "TAG", "This is plain text.");
    logEvent(1, "TAG", "This is a number: %d.", 12);
    logEvent(1, "TAG", "This is a string: %s.", "heebiejeebie");
    return 0;
}
void _log_proxy(log_level_t severity, const char * TAG, const char *fmt, ...) {
    va_list arg;
    va_start(arg, fmt);
    printf(fmt, arg);
    va_end(arg);
}

我发现格式字符串的参数在printf()调用中被打印为胡言乱语。我很确定我做错了一件很简单的事,我只是不知道那件很简单是什么。任何帮助都将不胜感激。

printf()替换为采用va_list参数的vprintf()

printf( char* string , ... )
vprintf( char* string , va_list list )

您要调用vprintf而不是printf

printfva_list解释为单个参数,打印胡言乱语(或其他一些未定义的行为)。