void func(const char* _Format, ...)
... 表示可变参
读取每个可变参
// 可变参列表
va_list list;
然后通过va_start宏开始读取可变参
va_start(list, _Format);
再用va_arg宏获取每个可变参的值
下面就读取了第一个可变参的值,若再执行一次,读取到的就是第二个可变参的值。
这个宏的第二个参数是返回的变量类型。
double d = va_arg(list, double);
读取完毕后,通过 va_end宏结束读取可变参
va_end(list);
可以将可变参传入到 sprintf 等带有可变参的函数中吗?
貌似不行,除非有专门支持传入可变参列表的函数,如vsprintf_s,它的原型:
int __CRTDECL vsprintf_s(
_Out_writes_(_BufferCount) _Always_(_Post_z_) char* const _Buffer,
_In_ size_t const _BufferCount,
_In_z_ _Printf_format_string_ char const* const _Format,
va_list _ArgList
)
可以看到,第四个形参是可变参数列表,我们可以通过这个函数传入可变参列表:
char str[32] = { 0 };
vsprintf_s(str, 30, _Format, list);
完整的例子
#include <stdio.h>
#include <Windows.h>
void MyPrint(const char* _Format, ...)
{
// 可变参列表
va_list list;
// 开始读取可变参
va_start(list, _Format);
char str[32] = { 0 };
vsprintf_s(str, 30, _Format, list);
// 结束读取可变参
va_end(list);
sprintf_s(str, 30, "%s - from MyPrint", str);
printf("%s", str);
}
int main()
{
int i = 1 + 3;
MyPrint("1+3 = %d", i);
while (true);
return 0;
}