★函数:
使用VA_LIST宏组解决变参问题
1、首先定义va_list型的变量,这个变量是指向参数的指针。
2、然后用va_start宏初始化刚定义的va_list变量,这个宏的第二个参数是“第一个可变参数的前一个参数”。
3、再用va_arg得到可变参数,第二个参数是“可变参数”的类型。
4、最后用va_end宏结束可变参数的获取。如果有多个可变参数,依次调用va_list获取各个参数。
使用VA_LIST应该注意的问题:
1、可变参数函数,必须通过某种方式事先预知传入参数的类型。可变参数函数的调用者,必须按照该方式传入对应类型的参数。一旦参数类型不匹配,将可能导致返回错误或无意义的数据,甚至栈被破坏。
2、编译器对可变参数的函数的原型检查不够严格,不利于写出高质量代码。在非必要情况下,应当尽量采用C++重载、多态等方式实现函数,而尽量不要使用可变参数。
★宏
宏也可以带可变参数,如:
#define PRINT( format, ... ) printf( format, ## __VA_ARGS__ );
“##”不可以省略,如果省略,就不可以省略可变参数部分。比如:“PINTF("hello");”,无可变参数部分,解释PRINT宏时就会多出一个“,”号,导致编译出错。
或者可以这样定义:
#define PRINT( format, args... ) printf( format, ##agrs );