我试图让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()调用中打印为乱码。我很确定我做了一件非常简单的错事,我只是不知道那件事是多么简单。任何帮助将不胜感激。
答案 0 :(得分:4)
将printf()
替换为带有va_list
参数的vprintf()
。
printf( char* string , ... )
vprintf( char* string , va_list list )
答案 1 :(得分:2)
您想致电vprintf
而不是printf
。
printf
将va_list
解释为单个参数,打印乱码(或其他一些未定义的行为)。