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

  • 相关阅读:
    HDOJ 1207 汉诺塔II
    [转]写代码的小女孩
    POJ Subway tree systems
    HDOJ 3555 Bomb (数位DP)
    POJ 1636 Prison rearrangement (DP)
    POJ 1015 Jury Compromise (DP)
    UVA 10003
    UVA 103 Stacking Boxes
    HDOJ 3530 Subsequence
    第三百六十二、三天 how can I 坚持
  • 原文地址:https://www.cnblogs.com/longwaytogo/p/6132323.html
Copyright © 2011-2022 走看看