C++允许在函数的参数列表中使用省略号(...),表示一些数量可在运行时变化,且类型不确定的参数。
比如scanf就使用了可变参数。
有名字的参数可以直接通过参数名访问,但是可变参数的访问要麻烦一些。
因为C++的函数栈是从高地址向低地址生长,而函数参数是从右向左进行压栈的,所以参数是从左向右连续地存放在内存中的。
显然,必须要知道可变参数的前一个参数的地址才能在内存中定位可变参数,像下面这样的函数声明是错误的。
所以一般的做法是用可变参数的前一个参数表示可变参数的个数,或者是像scanf和printf一样用格式化字符串。
有了第一个参数就可以访问后面的参数了,下面是一个加法函数的例子。
这样的指针操作比较麻烦,所以在cstdarg库中定义了进行相关操作的类型和宏:va_list, va_start, va_arg, va_end。下面是使用了这些宏的加法函数。
va_list是用来遍历参数的类型。(VC++中它被声明为char*)
va_start接受一个va_list和可变参数的前一个参数作为参数,它初始化va_list。
va_arg接受一个va_list和下一个参数的类型作为参数,它返回下一个可变参数并把va_list的指针往后移。
va_end接受一个va_list作为参数,它结束对可变参数的遍历。(并不明白这有什么意义,VC++中只是把传入的va_list赋成0了)