Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.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_args技巧_C++_Winapi_Visual C++_Trace_Etw - Fatal编程技术网

C++ 需要省略号和va_args技巧

C++ 需要省略号和va_args技巧,c++,winapi,visual-c++,trace,etw,C++,Winapi,Visual C++,Trace,Etw,是一个参数数目可变的WinAPI函数。这是一个跟踪函数,其符号类似于printf,它在Windows跟踪中生成跟踪消息。奇怪的是,它接收的格式字符串是省略号的一部分,而不是专用参数。 可以使用我自己的函数“重写”此函数,然后需要调用它(与TraceMessage相同,只是使用va_args而不是省略号) 到目前为止还不错;但是现在我想使用一个类似sprintf的函数来访问跟踪的消息,该函数的格式字符串不在省略号中。因此,我需要 -从省略号中获取格式字符串参数 -创建一个没有第一个参数的新va_列

是一个参数数目可变的WinAPI函数。这是一个跟踪函数,其符号类似于printf,它在Windows跟踪中生成跟踪消息。奇怪的是,它接收的格式字符串是省略号的一部分,而不是专用参数。 可以使用我自己的函数“重写”此函数,然后需要调用它(与TraceMessage相同,只是使用va_args而不是省略号)

到目前为止还不错;但是现在我想使用一个类似sprintf的函数来访问跟踪的消息,该函数的格式字符串不在省略号中。因此,我需要
-从省略号中获取格式字符串参数
-创建一个没有第一个参数的新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;
}