需要椭圆和va_args技巧

Ellipsis and va_args trick needed

本文关键字:args 技巧 va      更新时间:2023-10-16

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

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

你知道怎么做吗?特定于Visual Studio编译器的解决方案也是可以接受的。谢谢

使用va_list,您可以将其传递给一个函数,该函数在使用了va_arg并提取了一个或多个参数后,将获得va_listva_list将表现为只"包含"其余的参数。

我对TraceMessage本身没有任何经验,但我已经给出了一个使用标准vprintf和测试函数的示例。你应该能够适当地适应。

例如

#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, "%dn", 6);
    return 0;
}