C语言--变长参数

Posted mysky007

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 

 

 

 

以上是关于C语言--变长参数的主要内容,如果未能解决你的问题,请参考以下文章

c++11新特性:变长参数模板详解

C语言怎样定义变长数组

Java语法糖初探--变长参数

scala学习笔记-变长参数

Unix环境高级编程编写变长参数函数

Scala-变长参数