C语言可变参数个数的确定
时间:2010-10-19 来源:andyjooa
int dopen(int num, ...) |
但是如果不告诉参数的具体个数,需要自己去判断参数个数就比较麻烦,在网上搜了一下,看到如下方法甚好,采用可变参宏定义。具体方法如下:
参考网站:http://www.91linux.com/html/article/program/cpp/20100827/20289.html
#define PP_NARG(...) PP_NARG_(__VA_ARGS__,PP_RSEQ_N()) /* 求参数个数 */ |
此时便可用PP_NARG(...)来得到变参的个数,原理相信学过C语言的人一看便明白,这里默认最大能识别63个参数,当然PP_ARG_N宏和PP_RSEQ_N具体的数值可根据自己的需要变化,这里就不在废话了,举个应用例子吧:
假设你需定义这样一个函数:open(ID,...),假设此函数为打开设备函数,由于打开的设备可能不一样,需要的初始化参数及参数个数也不一样,还有用户可以省略几个参数采用默认值,这样就需要变参,而ID指明设备,具体用户传入几个参数便可用上面的宏得到:
#define open(ID,...) dopen(PP_NARG(__VA_ARGS__),ID, __VA_ARGS__) |
然后自己实现dopen就可以了,dopen的第一参数便为参数个数,第二个参数为原来的ID号,第三个便是原来的...变参。
其实还可以这样实现,用一个用户不可能用到的数值作为结束参数,具体做法如下:
#define DEFDATA 0xFFFFFFFF /* 用户可能用到的数据 作为结束标识 */ |