文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>C语言可变参数个数的确定

C语言可变参数个数的确定

时间:2010-10-19  来源:andyjooa

今天用到了可变参函数,对于C的可变参数,网上也有好多例子,其实比较简单,调用提供的库便可实现,好多例子都需要提供变参的个数,或者提供如%之类的标识符,网上全是这些例子,简单的例子如下:求num个整数的和。

int dopen(int num, ...)
{
    va_list args;
    int data = 0;
    int sum = 0;
    va_start(args, a);
    for (; num > 0; num--) {
        data = va_arg(args, int);
        sum += data;
    }
    va_end(args);
    return sum;
}

但是如果不告诉参数的具体个数,需要自己去判断参数个数就比较麻烦,在网上搜了一下,看到如下方法甚好,采用可变参宏定义。具体方法如下:
参考网站:http://www.91linux.com/html/article/program/cpp/20100827/20289.html

#define PP_NARG(...) PP_NARG_(__VA_ARGS__,PP_RSEQ_N()) /* 求参数个数 */
#define PP_NARG_(...) PP_ARG_N(__VA_ARGS__)
#define PP_ARG_N( \
                     __1,__2,__3,__4,__5,__6,__7,__8,__9,_10,\
                     _11,_12,_13,_14,_15,_16,_17,_18,_19,_20,\
                     _21,_22,_23,_24,_25,_26,_27,_28,_29,_30,\
                     _31,_32,_33,_34,_35,_36,_37,_38,_39,_40,\
                     _41,_42,_43,_44,_45,_46,_47,_48,_49,_50,\
                     _51,_52,_53,_54,_55,_56,_57,_58,_59,_60,\
                     _61,_62,_63,N,...) N
#define PP_RSEQ_N() \
                     63,62,61,60,\
                     59,58,57,56,55,54,53,52,51,50,\
                     49,48,47,46,45,44,43,42,41,40,\
                     39,38,37,36,35,34,33,32,31,30,\
                     29,28,27,26,25,24,23,22,21,20,\
                     19,18,17,16,15,14,13,12,11,10,\
                     9,8,7,6,5,4,3,2,1,0

此时便可用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           /* 用户可能用到的数据 作为结束标识 */
#define opent(a, ...) dopene(a, __VA_ARGS__, DEFDATA) // 将默认数据连接到后面
void dopene(int a, ...)
{
    va_list args;
    unsigned int data = 0;
    va_start(args, a);
    while(1);
    {
        data = va_arg(args, int);
        if (data == DEFDATA)         /* 相等时说明参数已经取完         */
        {
            break;
        }
        …… // 处理得到的数据

    }
    ……
    va_end(args);
}



相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载