可变参数 函数(可变参数列表--1)

13 篇文章 0 订阅
 

1.什么是可变长度参数

我们在C语言编程中有时会遇到一些参数个数可变的函数,即函数的入参个数和类型是不确定的,例如printf()函数,其函数原型为:

int printf(char* format, ...);

它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的(用三个点“…”做参数占位符),实际调用时可以有以下的形式:

printf("%d",i);

printf("the number is %d ,string is:%s", i, s);    

以上这些东西已为大家所熟悉。但是究竟如何写可变参数的C函数以及这些可变参数的函数编译器是如何实现的呢?

2.可变长度参数函数的一个例子

为了说明问题,通过编写一个自定义的可处理可变长度参数的函数minprintf来说明。

       printf函数的定义格式为:

       int printf(char *fmt, …)

       这里,的含义为参数的类型和个数是不确定的。声明只能出现在参数列表的尾部。函数返回输出的字符个数。

       我们自己定义的函数minprintf声明格式为:

       void minprintf(char *fmt, …)

       因为这里我们不需要返回输出的字符个数,所以定义返回类型为void

       带有可变长度参数的函数里,即没有参数的类型也没有参数的个数,那么编译器是怎么处理这样的函数的呢?

       标准头文件stdarg.h定义了一系列的宏来处理这个可变长度的参数列表。这个头文件的实现会因编译器的不同而各异,但它们的接口却是相同的。

       类型va_list 定义为这样一个数据类型,循环使用且每次指向一个可变的参数;在我们举的例子minprintf函数里指变量apargument pointer);

       函数va_start 初始化ap,使ap指向第一个可变的参数;注意,这个函数必须在使用ap前被调用;minprintf必须至少有一个确定的参数,而且,最后一个确定的参数才是va_sart函数的一个入参;

       函数va_arg:返回一个可变长度参数的值并使ap指向下一个可变长度参数,该函数使用一个类型名来确定要返回的类型和指针ap需要移动的字节单位;

       函数va_end:做一些必要的清理工作,需要在程序结束前调用。

other:

int vprintf(const char *format, va_list arg)
函数vprintf与printf等价,只是用arg替换了变量参数列表,arg由va_start宏初始化,并且va_arg可能会调用它。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值