zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C/C++可变参数

C++ 参数 可变
2023-09-11 14:20:53 时间

★函数:

使用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 );