需要椭圆和va_args技巧
Ellipsis and va_args trick needed
TraceMessage是一个参数数量可变的WinAPI函数。它是一个跟踪函数,其符号类似于printf,它在Windows跟踪中生成跟踪消息。奇怪的是,它接收的格式字符串是省略号的一部分,而不是专用参数。可以用我自己的函数"覆盖"这个函数,然后需要调用TraceMessageVa(这与TraceMessage相同,只是使用va_args而不是省略号(。
到目前为止还不错;但现在我想使用类似sprintf
的函数来访问跟踪的消息,该函数的格式字符串来自省略号。因此我需要
-从省略号中获取格式字符串参数
-创建一个不带第一个参数的新va_list。
你知道怎么做吗?特定于Visual Studio编译器的解决方案也是可以接受的。谢谢
使用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, "%dn", 6);
return 0;
}
相关文章:
- 在C++/Linux中设置单调时钟的一些技巧
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何修复带有 clang 的参数'args'缺少默认参数的问题?
- 无法掌握嵌套循环的写作技巧
- 添加新行时工作代码引发异常.调试技巧?
- CPPYY/CTYPES 将字符串数组作为 char* args[] 传递
- 如何使模板函数像 R f<void(int)>(args...)
- 怎么可能写 f( *this, std::forward<Args>(args)... ) 而 f 只用 F f 声明;
- 有什么技巧可以避免在模板类中使用"typename"关键字吗
- C++:竞争性编程技巧的解释
- 在C++中获取命名空间名称的任何可移植技巧
- 折叠表达式和参数包:static_assert 内 Args&& 和 Args 之间的区别
- 为什么我不能添加 && 到 Ret (Args...) &?
- Ret(&)(Args...)和Ret(Args...)&有什么区别?
- 什么是 'R(*pf)(void*, Args..)',函数指向方法的指针?
- VS2017模板专用化错误无法从'Class *(__cdecl *)(Args...)'转换为'Class *(__cdecl *)(Args...)'
- 在C++中,如何将参数添加到"Args&&... args"参数列表中?
- "auto o = SomeType(args)"而不是"SomeType o(args)
- C Typedef修复模板ARGS
- 作为参数的'char *args[]'和'char **argv'之间的差异