最近在看<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\n", s);
break;
case 'd': /* int */
d = va_arg(ap, int);
printf("int %d\n", 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\n", c);
break;
}
va_end(ap);
}

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

  man 3 stdarg

variadic function 的使用的更多相关文章

  1. C语言变参函数/Variadic fucntion

    几个重要的 宏/类型 定义 Macros Defined in header <stdarg.h> va_start enables access to variadic function ...

  2. C++11 : variadic templates(可变参数模板)

      Introduction: Before the possibilities of the new C++ language standard, C++11, the use of templat ...

  3. [c++] Templates

    Template是编译时多态.所有的模板都是在编译时产生对应的代码,它没有面向对象中的虚表,无法实现动态多态. Function Template A function template is a p ...

  4. Amd64 and Va_arg

    Made of Bugs Blog Archives Author Amd64 and Va_arg OCT 3RD, 2010 A while back, I was poking around L ...

  5. (转)C++0x语言新特性一览

    转自:http://blog.csdn.net/zwvista/article/details/2429781 原文请见http://en.wikipedia.org/wiki/C%2B%2B0x. ...

  6. iOS:消除项目中警告

    引言: 在iOS开发过程中, 我们可能会碰到一些系统方法弃用, weak.循环引用.不能执行之类的警告. 有代码洁癖的孩子们很想消除他们, 今天就让我们来一次Fuck 警告!! 首先学会基本的语句: ...

  7. 【转】clang warning 警告清单(备查,建议直接command + F 速查 )

    Warning Message -WCFString-literal input conversion stopped due to an input byte that does not belon ...

  8. 使用#pragma阻止一些warnings

    这篇博客的内容都是记的网上的.是流水账.只是记录下来以便日后之有,避免每次重新google. #pragma除了可以用来把不同功能的代码进行分隔组织外还可以用来disable一些warnings.这在 ...

  9. iOS -- warnings

    Semantic Warnings Warning Message -WCFString-literal input conversion stopped due to an input byte t ...

随机推荐

  1. 超简单,spring boot 添加mybatis

    看了很多人写的博客,要么太复杂,要么没有添加xml的方式,自己亲自配置了一下,供各位参考. 项目截图 1.添加pom文件 <!-- 设置mybatis --> <dependency ...

  2. GDB调试命令小结

    1.启动调试 前置条件:编译生成执行码时带上 -g,如果使用Makefile,通过给CFLAGS指定-g选项,否则调试时没有符号信息.gdb program //最常用的用gdb启动程序,开始调试的方 ...

  3. USACO . Greedy Gift Givers

    Greedy Gift Givers A group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided to exchange gifts ...

  4. [转]实现一个无法被继承的C++类

    From:http://blog.csdn.net/lazy_tiger/article/details/2224899 一个类不能被继承,也就是说它的子类不能构造父类,这样子类就没有办法实例化整个子 ...

  5. weblogic的集群与配置

    目录(?)[-] 1.Weblogic的集群 2.创建Weblogic集群前的规划 3.开始创建我们的Weblogic集群 1.1 创建集群的总控制端aminserver 2.2 创建集群中的节点my ...

  6. [LeetCode] Minimum Unique Word Abbreviation 最短的独一无二的单词缩写

    A string such as "word" contains the following abbreviations: ["word", "1or ...

  7. [LeetCode] Find the Difference 寻找不同

    Given two strings s and t which consist of only lowercase letters. String t is generated by random s ...

  8. 在WPF程序中打开网页:使用代理服务器并可进行JS交互

    本项目环境:使用VS2010(C#)编写的WPF程序,通过CefSharp在程序的窗体中打开网页.需要能够实现网页后台JS代码中调用的方法,从网页接收数据,并能返回数据给网页.运行程序的电脑不允许上网 ...

  9. 将HTML5封装成android应用APK文件的几种方法

    越来越多的开发者热衷于使用html5+JavaScript开发移动Web App.不过,HTML5 Web APP的出现能否在未来取代移动应用,就目前来说,还是个未知数.一方面,用户在使用习惯上,不喜 ...

  10. 求n!最后一位非零数

    引子:求n!末尾0的个数 n!末尾的0来源只有2,5两个质数相乘.所以只需要考察n!中包含多少个2和多少个5.然后取其较小值即为所求.即ans=min(cnt(2),cnt(5)).而转念一想,cnt ...