zoukankan      html  css  js  c++  java
  • C语言--变长参数

    一.  实现原理
      首先变长参数的实现依赖于cdecl调用,因为其规定了出栈方为函数调用方,从而解决被调用函数无法确定参数个数,其次cdecl规定参数入栈顺序为从右到左。所以第一个不定参数位于栈顶
     
    二. 宏源码讲解  (va ---> variable-argument(可变参数))
    头文件 stdarg.h

    2.1 va_list

    #define va_list char *

    定义了一个指针arg_ptr, 用于指示可选的参数.

    2.2 va_start(arg_ptr, argN)

    #define va_start (ap, arg)  (ap = (va_list)&arg+sizeof(arg))

    使参数列表指针arg_ptr指向函数参数列表中的第一个可选参数,argN是位于第一个可选参数之前的固定参数, 或者说最后一个固定参数.如有一va
    函数的声明是void va_test(char a, char b, char c, ...), 则它的固定参数依次是a,b,c, 最后一个固定参数argN为c, 因此就是va_start
    (arg_ptr, c).

    2.3 va_arg(arg_ptr, type)

    #define va_arg (ap, t)  (*(t*)( ap+=sizeof(t) - sizeof(t)))

    返回参数列表中指针arg_ptr所指的参数, 返回类型为type. 并使指针arg_ptr指向参数列表中下一个参数.返回的是可选参数, 不包括固定参数.

    2.4 va_end(arg_ptr)

    #define va_end  (ap = (va_list)0)

    清空参数列表, 并置参数指针arg_ptr无效.

    三. 实例

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <stdarg.h>
     4 
     5 void test(const char *format, ...)
     6 {
     7     va_list args;
     8     const char *args1;
     9     va_start(args, format);
    10     args1 = va_arg(args,const char *);
    11     va_end(args);
    12     printf("format = %s  args1 = %s",  format,  args1);
    13 }
    14 int main()
    15 {   
    16     test( "test1", "test2");
    17     return 0;
    18 }
  • 相关阅读:
    软件开发者路线图 从学徒到高手 读后感
    Greplin:搜索你的所有在线社交内容
    黄小琥 / 简单/不简单 / 没那么简单
    讯雷 云系列 不错
    来自Amazon、Cloudera、Microsoft与IBM的HadoopasaService
    FAQs and feedback
    I've Never Been To Me by Charlene with lyrics
    烧香网 历害
    4A公司
    一个新的比较网站,做的不错
  • 原文地址:https://www.cnblogs.com/mysky007/p/11204296.html
Copyright © 2011-2022 走看看