Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在包装函数调用序列中正确使用va_列表?_C++_C_Embedded - Fatal编程技术网

C++ 如何在包装函数调用序列中正确使用va_列表?

C++ 如何在包装函数调用序列中正确使用va_列表?,c++,c,embedded,C++,C,Embedded,我有一个用于微控制器的以太网库(用于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将数据发送到错误的流,我需要将库的调试输出重定向

我有一个用于微控制器的以太网库(用于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将数据发送到错误的流,我需要将库的调试输出重定向到正确的串行端口。 库有.cFiGigEe文件,我编写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_列表重写代码,因为它通常在示例中生成:

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 };

  sprintf(buffer, fmt, args);

  debugUart->write(buffer);
}
void (* printDebugMsg)(const char * fmt, ...) = &printDebugMsgImplementation;
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_列表?

您不能将
va_列表
传递给一个需要
的函数,除非该函数(当然)需要变量参数部分中的
va_列表
。你的代码显然没有


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

您非常正确,谢谢!我在包装器函数中更改为“va_列表”,并删除了“va_列表开始/结束”中的用法,现在一切正常。@FominArseniy它发生了。:)谢谢如果你觉得我的答案对你有帮助,请随意接受。小点:带有双下划线的名称是保留给实现使用的,因此请将你的函数调用其他名称,以避免与标准标题中的内容发生冲突。我从不使用带有双下划线的函数。这是我不能更改的库函数。联系Keil.:)