• c++ 可变参数用法


    头文件

    #include <stdarg.h>

    使用

    设你的函数签名是

    int sum(int n, ...);

    首先获得你的可变参数列表

    va_list args;
    va_start(args,n);

    这里args是存储你的变量的指针,n是你的最后一个非可变参数

    然后是获得所有参数

    int vals[n];
    for(int i=0;i<n;++i)
    {
    vals[i]
    =va_arg(args,int);
    cout
    <<"arg "<<i<<" "<<vals[i]<<endl;
    }

    .

    ok,结束了。当然你也可以最后加一句

    va_end(args);

    虽然这句话没有任何程序上的作用。

    点评

    宏确实是geek玩的东西,这正是c的独到之处。获得可变参数的原理很简单,args获得栈顶指针,根据类型读取相应字节,然后进行反编码返回给变量。

    这里只摘录最有趣的 va_arg的实现

    #define va_arg(list, mode) ((mode *)(list = \
    (
    char *) ((((int)list + (__builtin_alignof(mode)<=4?3:7)) & \
    (__builtin_alignof(mode)
    <=4?-4:-8))+sizeof(mode))))[-1]

    c果然余存着汇编的风韵,c#和java里是很难看到这种用法咯。

    当然,这种用法的局限也是很明显的,也是不可克服的:我们得知道到底有几个参数,虽然这里的名字叫可变参数

    通常的方法有两种,第一种是像前面那样,直接指明可变参数的个数,printf和scanf也是如此,通过%来指明;第二种方法就是在可变参数的最后加个监视哨,类似于 '\0'

    .

    另外插个题外话,正是因为这种用法,所以scanf是有可能让你死机的呦~

  • 相关阅读:
    wmware虚拟系统光盘的问题
    ORM框架SQLAlchemy
    python关于二分查找
    Python的各种推导式合集
    远程连接腾讯云服务器MySQL数据库
    Django配置404页面
    使用Python将Excel中的数据导入到MySQL
    MySQLl导入导出SQL文件
    数据结构(十三)排序
    数据结构(十二)散列表
  • 原文地址:https://www.cnblogs.com/dabaopku/p/2098792.html
Copyright © 2020-2023  润新知