我有一个用于微控制器的以太网库(keil rl-tcpnet用于lpc2478)。 库以这种方式在调试输出函数中使用va_list(stdarg.h中定义的arg数组宏的标准指针):
void __debug__ (const char *fmt, ...)
{
va_list args;
va_start (args,fmt);
vprintf (fmt,args);
va_end (args);
}
然而,vprintf将数据发送到错误的流,我需要将库的调试输出重定向到正确的串行端口。 库有.c cofigure文件,我编写c ++代码,所以我使用包装器函数指针从c代码调用c ++样式代码。所以我重写了这个函数:
extern void (* printDebugMsg)(const char * fmt, ...);
void __debug__ (const char *fmt, ...)
{
va_list args;
printDebugMsg(fmt, args);
}
其他cpp文件:
void printDebugMsgImplementation(const char * fmt, ...)
{
va_list args;
char buffer[100] = { 0 };
sprintf(buffer, fmt, args);
debugUart->write(buffer);
}
void (* printDebugMsg)(const char * fmt, ...) = &printDebugMsgImplementation;
结果调试输出如下:
TCP: Init 0 Sockets
IP : Src. IP : 0.0.14.1668436768
ETH: Dest.MAC: A1E05E10:A0002B44:5F9F:01:5FF8:33
文本和一些数字(如0)似乎是正确的,但大多数其他数字似乎是错误格式化的(但它也可能是内部库问题)。 我尝试使用va_list重写我的代码,因为它通常在示例中进行:
void __debug__ (const char *fmt, ...)
{
va_list args;
va_start (args,fmt);
printDebugMsg(fmt, args);
va_end (args);
}
和.cpp文件:
void printDebugMsgImplementation(const char * fmt, ...)
{
va_list args;
char buffer[100] = { 0 };
va_start(args, fmt);
vsprintf(buffer, fmt, args);
va_end(args);
debugUart->write(buffer);
}
但结果却更糟糕的是:
TCP: Init -1579131344 Sockets
ARP: Dest.IP: -1579131400.-1610601474.24805.4
ARP: Src.MAC: A1E05DF8:A0002BFE:60FF:04:616C:20
我做错了什么?在我的包装函数调用中如何处理va_list?
答案 0 :(得分:2)
您不能将va_list
传递给期望...
的函数,除非该函数(当然)在变量参数部分中需要va_list
。你的代码显然没有。
你需要在va_list
中明确接受printDebugMsg()
参数,因为这就是你传递的内容。例如,请参阅vprintf()
,它解决了printf()
系列的此问题。