C ++中的Variadic宏无法按预期工作

时间:2014-10-25 15:59:45

标签: c++ variadic

我试图让printf()像在我的C ++应用程序中调用日志函数一样。我发现this reference几乎解释了我想做什么。但是,我没有运气让这个概念在我的应用程序中按预期工作。我把它缩放回来,直到我能得到最基本的程序来证明问题,这就是:

#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()调用中打印为乱码。我很确定我做了一件非常简单的错事,我只是不知道那件事是多么简单。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

printf()替换为带有va_list参数的vprintf()

printf( char* string , ... )

vprintf( char* string , va_list list )

答案 1 :(得分:2)

您想致电vprintf而不是printf

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