需要省略号和 va_args 技巧

发布于 2024-11-03 03:45:15 字数 572 浏览 5 评论 0原文

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

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

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

TraceMessage is an WinAPI function with variable number of arguments. It is a tracing function, with a notation similar to printf, which generates a trace message in Windows tracing. The weird part here is that it receive a format string as part of the ellipsis, not as a dedicated argument.
It is possible to 'override' this function with a function of my own, which then needs to call TraceMessageVa (which is the same as TraceMessage, just with va_args rather than ellipsis).

So far so good; but now I want to access the traced message using a sprintf-like function, which has the format string out of the ellipsis. Thus I need to
- get the format string argument out of the ellipsis ;
- create a new va_list without the first argument.

Any idea about to how do it? Solutions specific to Visual Studio compiler are also acceptable. Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦里泪两行 2024-11-10 03:45:15

使用 va_list,您可以将其传递给一个函数,该函数在使用 va_arg 提取一个或多个参数后,会采用 va_list。然后,va_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, "%d\n", 6);
    return 0;
}

With a va_list you can pass it to a function which takes a va_list after having used va_arg on it already to have extracted one or more arguments. The va_list will then act like it "contains" only the rest of the arguments.

I have no experience with TraceMessage itself, but I've given an example using standard vprintf and a test function. You should be able to adapt as appropriate.

E.g.

#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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文