关于函数可变参的问题
[編輯] [转简体] (简体译文)
|
作者:huidong
| 分類:【編程】C/C++
[
8 瀏覽
0 評論
1 贊
1 踩
]
概要
如何创建为函数可变参数的问题……
正文
创建可变参函数
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; }