zoukankan      html  css  js  c++  java
  • C语言中的可变参数列表

    Linux-0.11源码中init/mian.c文件中定义了printf()函数,这个函数的参数包含了可变参数列表。以前没太注意过可变参数列表,所以这个地方没看懂,所以拿过来K&R翻了翻,找到了答案。

    这是我写的测试函数:

    /*************************************************************************
        > File Name: args_list.c
        > Author:qusijun
        > Mail: wiilen.lian@gmail.com 
        > Created Time: 2013年11月15日 星期五 21时16分25秒
     ************************************************************************/
    
    #include<stdio.h>
    
    #include<stdarg.h>
    
    void print_args(int args, ...)
    {
        va_list ap;
        //在访问任何未命名的参数之前,必须用va_start宏初始化ap一次
        va_start(ap,args);
        printf("%d
    ",args);
        printf("%d
    ",va_arg(ap,int));
        printf("%s",va_arg(ap,char *));
       va_end(ap); }
    int main(void) { int arg = 2; int args1 = 1; char *args2 = "lianwenlong"; print_args(2,args1,args2); return 0; }

    看看K&R中是怎么说的:

    头文件<stdarg.h>提供了遍历未知数目和类型的函数参数列表的功能。

    假定函数f带有可变数目的实际参数,lastarg是它的最后一个命名的形式参数,那么,函数f内声明一个va_list的变量ap,它将依次指向每个实际参数:

    va_list ap;

    在访问任何未命名的参数前,必须用va_start宏初始化ap:

    va_start(ap,lastarg);

    此后,每次执行宏va_arg都将产生一个与下一个未命名的参数具有相同类型和数值的值,它同时修改ap使得ap指向下一个参数:

    type va_arg(arg,type);

    在所有的参数处理完毕之后,且在退出函数f之前,必须调用宏va_end一次:

    va_end(ap);

    ps:我一开始的测试函数中并没有调用va_end()函数,但可以正常运行。

  • 相关阅读:
    [codeforces] 97B Superset || 平面分治
    [hdu] 5696 区间的价值 || 序列分治
    [zoj] 1937 [poj] 2248 Addition Chains || ID-DFS
    [poj] 2286 The Rotation Game || ID-DFS
    [codeforces] 25E Test || hash
    luogu P1196 银河英雄传说
    luogu P1357 花园
    luogu P1156 垃圾陷阱
    luogu P1127 词链
    luogu P1131 时态同步
  • 原文地址:https://www.cnblogs.com/lianwl/p/3426137.html
Copyright © 2011-2022 走看看