zoukankan      html  css  js  c++  java
  • variadic function 的使用

    最近在看<the c programming language> K&R  

      7.3章 Variable-length Argument Lists  变长参数列表, 笔记一下用法

    1. 要用到的头文件  <stdarg.h>

      包含一些用来遍历(step through)变长参数列表的  宏(marco)定义

    2. 类型 va_list : refer to each argument in turn    (va 是 variadic arguments的缩写)

      va_list ap;     /* 声明va_list 类型的指针 ap */

    3. 宏va_start 

      用法: va_start(va_list , char *);

      初始化 va_list 类型的指针, 指向列表中第一个未命名的参数, 一定要先调用它

      va_start 要用到最后一个命名的参数,所以函数参数列表中至少要有一个命名参数

    4.va_arg

      用法: va_arg(va_list , type name);         /* type name 可能是 int double 这些类型 */

      返回一个参数, 将指针指向下一个参数

    5.va_end

      用法: va_end(va_list);

      对va_start 的善后工作

    6.va_cpy

      用法:  va_copy(va_list src, va_list dest);  

    示例代码: (摘自: man page)

    对va_list  va_start va_arg  va_end 的简单顺序调用

    /*  The  function  foo  takes  a string of format characters and prints out the argument associated
     *     with each format character based on the type.
    */
    #include <stdio.h> #include <stdarg.h> void foo(char *fmt, ...) { va_list ap; int d; char c, *s; va_start(ap, fmt);       while (*fmt) switch (*fmt++) { case 's': /* string */ s = va_arg(ap, char *); printf("string %s ", s); break; case 'd': /* int */ d = va_arg(ap, int); printf("int %d ", d); break; case 'c': /* char */ /* need a cast here since va_arg only takes fully promoted types */ c = (char) va_arg(ap, int); printf("char %c ", c); break; } va_end(ap); }



    : Linux下可以用man 命令查看 stdarg, va_start, va_arg, va_end, va_copy

      man 3 stdarg

  • 相关阅读:
    栏目调用 sql语句
    一场豪赌 微软的未来取决于Windows 8
    mark
    [导入].net中的如何私有部署强命名组件
    q160问题,www.q160.com,ie被篡改
    解决jdgui保存源码自动添加注释的情况
    汉诺塔问题
    软件测试 方法总结
    javascript 基础篇4 window对象,DOM
    javascript 进阶篇1 正则表达式,cookie管理,userData
  • 原文地址:https://www.cnblogs.com/longwaytogo/p/6132323.html
Copyright © 2011-2022 走看看