关于C++的可变参数问题。
va_list用于存取可变参数。va_start用来初始化va_list变量。va_arg用来获取下一个可变参数。va_end用来反初始化va_list变量。va_arg函数根据当前给定的类型来取得当前指向的函数参数,并且递增内部的一个指针指向下一个参数。
比如
va_arg(arguments, char*)
这里假设当前参数是char*类型,并修改内部指针,递增sizeof(char*)指向下一个参数。获取的值可能是指向"Beijing"或者"Olympic Games"的指针。
va_arg(arguments, int)
假设当前参数是int类型,并修改内部指针,递增sizeof(int)指向下一个参数。这里可能的值是2000(2个都是2000)。
注意,这是个非常低级的函数,在调用va_arg时指定的参数类型需要和传递时的一致,否则可能crash。还有需要注意的是,由于传递给这种函数时,char等类型会转化为int,所以在调用va_arg时必须使用int而不是char来提取参数,详见http://en.cppreference.com/w/cpp/utility/variadic。
何为反初始化?是不是只要照着这样的格式就可以了?va_start,va_arg,va_end都是相同的格式?
我觉得那个va_start是第一个参数名。之后的就是随便自定义了,需要什么类型就定义什么类型,是吧。
反初始化就是uninitialization,也就是初始化的反操作。
va_start必须是最后一个命名参数,这样才能正确初始化内部数据结构,以获得后续参数,否则不知道该从哪里开始存取参数。比如你有多个命名参数,后跟一个可变参数,那么第一个参数必须是最后一个命名参数。
int f(int a, int b, ...) {
va_start(b, my_va_list);
}