va_list
是在C语言中解决变参问题的一组宏,它是一个指向可变参数的列表的指针。通过它,我们可以遍历和访问传递给函数的可变参数
va_list
和相关的宏提供了一个机制,使得在函数内部能够处理可变数量的参数,并且可以根据不同的参数类型进行相应的操作和处理。
va_list的用法
(1)先在函数里定义va_list 型的变量 ,这个变量是指向参数的指针 ,通过指针运算来调整访问的对象;
(2)然后用 va_start 宏初始化变量刚定义的 va_list 变量 ,实际上 就是用 va_list 去指向函数的最后一个具名的参数; void va_start(va_list ap, last_arg)
(3)再用 va_arg 宏返回可变的参数,va_arg 的第二个参数是你要返回的参数的类型(如果函数有多个可变参数的,依次调用 va_arg 获取各个参数); type va_arg(va_list, type)
(4)参数列表访问完以后,要进行回收,否则出现野指针。va_start 与va_end配套一起用。
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
参数:str保存输出字符数组存储区。size存储区的大小。format包含格式字符串的C字符串,其格式字符串与printf中的格式相同arg变量参数列表,用va_list 定义。
示例如下:
extern "C" 是 C++ 中的一个关键字组合,用于在 C++ 代码中使用 C 语言风格的函数、变量和其他符号.例如你要在 C++ 代码中使用 C 函数,则需要在使用之前告诉编译器,应该使用 C 风格的命名,而不是 C++ 风格的名称修饰。在函数声明前使用 extern "C"
来实现
先定义va_list 型的变量,然后用 va_start初始化这个变量,第二个参数要写最后一个有名的参数。这样ap指针就指向了format。 (void)level;用于消除编译器的未使用变量警告
使用 vsnprintf
函数将可变参数列表中的数据按照指定的格式化字符串 format
填充到 buf
缓冲区中,并返回实际写入 buf
的字符数(不包括终止符 \0
)
如果写入成功且字符数小于 buf
的大小,则使用 fprintf
函数将 buf
内容输出到标准错误流 stderr
中
使用 va_end
宏结束可变参数列表的访问(回收指针,避免野指针)