可变参数函数
- C++允许定义形参个数和类型不确定的函数;
- 在声明不确定形参可以使用省略号
... 代替; - 故在函数调用是,不检查形参类型你是否与实参类型相同,也不检查参数个数;
- 实例
void func(int i, ...);
- 需要注意的是,编译器需要检查第一个参数,故第一个参数不可省略;
- 对于可变参数的函数,需要进行特殊的处理。首先需要引用 <stdarg.h>头文件,然后利用va_list类型和va_start、va_arg、va_end 3个宏读取传递到函数中的参数值。
<stdarg.h>的宏函数
- va_list数据类型,实际是char *数据类型;
va_arg()函数
type va_arg( va_list arg_ptr, type );
va_start()函数
void va_start( va_list arg_ptr, prev_param );
va_end()函数
void va_end( va_list arg_ptr );
vsprintf()函数
int vsnprintf( char* buffer, size_t buf_size, const char* format, va_list vlist );
- vsnprintf() 函数将format 指向的字符串写入字符串缓冲区;
- 可写入的最大字符数为 buf_size ;
- 写入字符后,添加终止空字符;
- 如果buf_size 等于零,则不写入任何内容并且buffer 可能是空指针;
- 字符串格式可能包含以 % 开头的格式说明符,这些说明符被作为列表 vlist 传递的变量的值替换;
- 在 头文件中定义;
实例
#include <stdio.h>
#include <stdarg.h>
#include <iostream>
#define MAXLEN 10
int func(char* format, ...)
{
char str[MAXLEN];
int i = 0;
va_list vArgList;
va_start(vArgList, format);
i = vsnprintf(str, MAXLEN, format, vArgList);
va_end(vArgList);
cout << str << endl;
for (int j = 0; j < MAXLEN; j++)
{
cout << str[j] << " ";
}
cout << endl;
return i;
}
int main()
{
int i = func("%s,%d,%d,%c", "abc", 1, 2, '\n');
cout << i << endl;
system("pause");
return 0;
}
abc,1,2
97 98 99 44 49 44 59 44 10 0
9
|