可变参数函数中的 printf 打印垃圾
printf inside variadic function prints garbage
我正在尝试创建一个可自定义的调试库,这样我就可以在外部声明我的调试函数并将其作为回调设置到库中,这样其他库就可以在不知道这些回调是如何定义的情况下调用这个调试函数。
我的 debug.c 文件包含以下摘录:
// NOTE: type defined in .h as: typedef void(*debug_custom_callback_t)(const char *format, ...);
debug_custom_callback_t debug_custom_callback[DEBUG_NUM_CALLBACKS];
void debug_log_printf(uint8_t idx, const char *format, ...){
va_list args;
// callback exists
if(debug_custom_callback[idx]){
va_start(args, format);
debug_custom_callback[idx](format, args);
va_end(args);
}
}
void debug_set_callback(uint8_t idx, debug_custom_callback_t callback){
//callback assigning
if(callback && idx < DEBUG_NUM_CALLBACKS)
debug_custom_callback[idx] = callback;
}
这个库有自己的 makefile,因此它可以编译为 .a 库,并与主代码的 makefile 中的 -l 标志链接。
主要代码使用调试库如下:
...
//main code
uint8_t test = 0xFF;
debug_set_callback(0, main_printf);
debug_log_printf(0, "Testing %d %d\n", test, 1); // prints: Testing -1095376668 -1225391600
...
//Definition of main_printf
void main_printf(const char *format, ...){
va_list args;
va_start(args, format);
printf(format, args);
va_end(args);
}
但这不能正常工作。字符串打印正确,但我尝试打印的任何值都打印为垃圾。如您所见,即使是常量也打印得很糟糕。
我错过了什么?
提前谢谢你。
改用vprintf
。
void main_printf(const char *fmt, va_list args) {
vprintf(fmt, args);
}
我正在尝试创建一个可自定义的调试库,这样我就可以在外部声明我的调试函数并将其作为回调设置到库中,这样其他库就可以在不知道这些回调是如何定义的情况下调用这个调试函数。
我的 debug.c 文件包含以下摘录:
// NOTE: type defined in .h as: typedef void(*debug_custom_callback_t)(const char *format, ...);
debug_custom_callback_t debug_custom_callback[DEBUG_NUM_CALLBACKS];
void debug_log_printf(uint8_t idx, const char *format, ...){
va_list args;
// callback exists
if(debug_custom_callback[idx]){
va_start(args, format);
debug_custom_callback[idx](format, args);
va_end(args);
}
}
void debug_set_callback(uint8_t idx, debug_custom_callback_t callback){
//callback assigning
if(callback && idx < DEBUG_NUM_CALLBACKS)
debug_custom_callback[idx] = callback;
}
这个库有自己的 makefile,因此它可以编译为 .a 库,并与主代码的 makefile 中的 -l 标志链接。
主要代码使用调试库如下:
...
//main code
uint8_t test = 0xFF;
debug_set_callback(0, main_printf);
debug_log_printf(0, "Testing %d %d\n", test, 1); // prints: Testing -1095376668 -1225391600
...
//Definition of main_printf
void main_printf(const char *format, ...){
va_list args;
va_start(args, format);
printf(format, args);
va_end(args);
}
但这不能正常工作。字符串打印正确,但我尝试打印的任何值都打印为垃圾。如您所见,即使是常量也打印得很糟糕。
我错过了什么?
提前谢谢你。
改用vprintf
。
void main_printf(const char *fmt, va_list args) {
vprintf(fmt, args);
}