zoukankan      html  css  js  c++  java
  • 可变参数函数

    https://blog.csdn.net/zhangxiangdavaid/article/details/38278249

    https://www.cnblogs.com/engraver-lxw/p/7225232.html

    int demo(char* msg,...)
    {
        if (!msg)
        {
            return 0;
        }

        int count = 0;

        va_list p;
        va_start(p, msg);

        while (true)
        {
            count++;
            char* s = va_arg(p, char*);

            if (strcmp(s, "") == 0)
            {
                printf(" ");
                break;
            }

            printf("%s", s);
        }

        va_end(p);

        return count;
    }

    //测试
    int count = demo("demo", "This", "is", "a", "demo!", "");

    可变参数函数的一般形式如下:
    返回值类型 函数名(类型1 参数1,类型2 参数2,...类型n 参数n,...);

    如上所示,这是一个典型的可变参数样式,它共有n个确定的参数,最后的...表示可变参数的含义。必须指出...必须位于最后,并且它至少要有一个确定的参数。

    为了开发可变参数的函数,需用到头文件stdarg.h。
    下面是 <stdarg.h> 里面重要的几个宏定义如下:
    typedef char* va_list;
    void va_start ( va_list ap, prev_param ); /* ANSI version */
    type va_arg ( va_list ap, type );
    void va_end ( va_list ap );


      va_list 是一个字符指针,可以理解为指向当前参数的一个指针,取参必须通过这个指针进行。
      <Step 1> 在调用参数表之前,定义一个 va_list 类型的变量,(假设va_list 类型变量被定义为ap);
      <Step 2> 然后应该对ap 进行初始化,让它指向可变参数表里面的第一个参数,这是通过 va_start 来实现的,第一个参数是 ap 本身,第二个参数是在变参表前面紧挨着的一个变量,即“...”之前的那个参数;
      <Step 3> 然后是获取参数,调用va_arg,它的第一个参数是ap,第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值,并且把 ap 的位置指向变参表的下一个变量位置;
      <Step 4> 获取所有的参数之后,我们有必要将这个 ap 指针关掉,以免发生危险,方法是调用 va_end,他是输入的参数 ap 置为 NULL,应该养成获取完参数表之后关闭指针的习惯。说白了,就是让我们的程序具有健壮性。通常va_start和va_end是成对出现

    va_start()的作用是使va_list型的变量指向第一个可变参数,故需要使用到离...最近的一个固定的确定的参数,
    这就是在设计可变参数函数时至少需要一个确定参数的原因。

    接着使用va_arg(p, char*),不断解析pData指向内存区域,且要指明用何种方式解析,这是va_arg()第二个参数的作用,
    解析完后,pData指向下一个可变参数的地址。由此即可得到所有的可变参数的值。

  • 相关阅读:
    新浪微盘又是一个给力的产品啊,
    InfoQ: 百度数据库架构演变与设计
    列式数据库——Sybase IQ
    MapR初体验 淘宝共享数据平台 tbdata.org
    IBM正式发布新一代zEnterprise大型机(组图) 大型机,IBM,BladeCenter,美国,纽约 TechWeb News
    1TB is equal to the number of how many GB? 1PB equal to is equal to the number of TB? 1EB PB? | PCfault.com
    Cassandra vs HBase | WhyNosql
    The Hadoop Community Effect
    雅虎剥离开源软件平台 Hadoop ,与风投新建 Hortonworks 公司 品味雅虎
    RowOriented Database 、ColumnOriented Database 、KeyValue Store Database 、DocumentOriented Database
  • 原文地址:https://www.cnblogs.com/zhangxuan/p/10615798.html
Copyright © 2011-2022 走看看