gpt4 book ai didi

c++ - 如何在包装函数调用序列中正确使用 va_list?

转载 作者:太空宇宙 更新时间:2023-11-04 08:40:48 24 4
gpt4 key购买 nike

我有一个用于微 Controller 的以太网库(用于 lpc2478 的 keil rl-tcpnet)。库以这种方式在调试输出函数中使用 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?

最佳答案

您不能将 va_list 传递给需要 ... 的函数,除非该函数(当然)需要 va_list可变参数部分。您的代码显然没有。

您需要在 printDebugMsg() 中显式接受一个 va_list 参数,因为这就是您要传递的内容。参见例如 vprintf()它为 printf() 系列解决了这个问题。

关于c++ - 如何在包装函数调用序列中正确使用 va_list?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23676474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com