C++ 需要省略号和va_args技巧
是一个参数数目可变的WinAPI函数。这是一个跟踪函数,其符号类似于printf,它在Windows跟踪中生成跟踪消息。奇怪的是,它接收的格式字符串是省略号的一部分,而不是专用参数。 可以使用我自己的函数“重写”此函数,然后需要调用它(与TraceMessage相同,只是使用va_args而不是省略号) 到目前为止还不错;但是现在我想使用一个类似sprintf的函数来访问跟踪的消息,该函数的格式字符串不在省略号中。因此,我需要C++ 需要省略号和va_args技巧,c++,winapi,visual-c++,trace,etw,C++,Winapi,Visual C++,Trace,Etw,是一个参数数目可变的WinAPI函数。这是一个跟踪函数,其符号类似于printf,它在Windows跟踪中生成跟踪消息。奇怪的是,它接收的格式字符串是省略号的一部分,而不是专用参数。 可以使用我自己的函数“重写”此函数,然后需要调用它(与TraceMessage相同,只是使用va_args而不是省略号) 到目前为止还不错;但是现在我想使用一个类似sprintf的函数来访问跟踪的消息,该函数的格式字符串不在省略号中。因此,我需要 -从省略号中获取格式字符串参数 -创建一个没有第一个参数的新va_列
-从省略号中获取格式字符串参数
-创建一个没有第一个参数的新va_列表
你知道怎么做吗?也可以接受特定于Visual Studio编译器的解决方案。谢谢 使用
va_列表
您可以将其传递给一个函数,该函数在已对其使用va_arg
以提取一个或多个参数后,会接受va_列表
。然后,va_列表
将表现为仅“包含”其余参数
我没有使用TraceMessage
本身的经验,但我给出了一个使用标准vprintf
和测试函数的示例。你应该能够适应适当的环境
例如
#包括
#包括
无效测试(INTA,…)
{
va_列表va;
常量字符*x;
va_启动(va,a);
x=va_arg(va,常量字符*);
vprintf(x,va);
va_端(va);
}
内部主(空)
{
测试(5,“%d\n”,6);
返回0;
}
TraceMessage的文档并没有说它做了您所说的事情。这是正确的,但您应该相信我,或者将其视为关于省略号和变量的问题,而不管跟踪上下文如何。。。
#include <stdio.h>
#include <stdarg.h>
void test(int a, ...)
{
va_list va;
const char* x;
va_start(va, a);
x = va_arg(va, const char*);
vprintf(x, va);
va_end(va);
}
int main(void)
{
test(5, "%d\n", 6);
return 0;
}