程序笔记   发布时间:2022-06-07  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c语言基于stdarg.h的可变参数函数的用法大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

C语言编程中有时会遇到一些参数个数可变的函数,本文详细讲解了可变参数函数的实现原理,分享给大家

开始学习C语言的函数的时候,我们就知道函数的参数个数应该是在函数声明的时候就指定的,这一点我们没有任何疑问。但是不知道大家有没有注意到我们的printf()函数,他的函数参数理论上并不是确定的,而是随着匹配字符串中的格式控制符的个数控制的。其实当时也没有注意到这一点,到是最近,偶然间看到了 《嗨翻C语言》 这本书,这里就详细讲解了这种可变参数函数的实现原理,今天试间隙就顺带学习了一下,其实就是一种方法,知道了就晓得了,也是非常的简单

头文件

这个用法需要引用一些宏,这些宏定义在C标准库“stdarg.h”中,(当然C++中就是“cstdarg”了)。

函数声明

int fun(int arg1,int arg2,...){
//foo
}


这里可以用普通传参方法传入几个固定参数,一般情况下会有个表示可变参数的个数(否则函数也不晓得你到底传给了他啥),最后表示可变参数部分的是三个连续的点,注意中间不能有空格。我们传入的可变参数就是在这里的。

具体用法

这里主要涉及到va_List类型,va_start()、va_arg()、va_end()这几个函数。

va_List 可以理解为以链表的形式保存那些可变参数的一个数据类型(既然是链表,当然是可变的了)。

voID va_start(va_List ap,int len); 接受两个参数,一个是上面的那个东西,还有一个表示数据的数目。目测可以理解为是自动收集传给本函数的可变参数,并连带他的数目,将信息赋给 va_List 。

type va_arg(va_List ap,type ); 接受两个参数,一个是va_List,另一个是保存的数据的类型。因为在调用参数的时候,编译器不会检查实际输入的是什么参数,所以需要适时的指定,并以那个类型返回。注意,这时候在va_List中的某个指针会指向下一个元素,所以下一次调用时输出的值就是下一个元素。在这一点上用法类似于iterator。

voID va_end(va_List ap);最后清理这个va_List.

演示源码

#include<stdarg.h>
#include<stdio.h>
voID print(intarg,...){
 va_List ap;
 va_start(ap,arg);
 for (int i = 0; i < arg; i++){
 printf("%d ",va_arg(ap,int));
 }
 va_end(ap);
}
int main(){
 print(4,1,2,3,4);
}

结果自然是输出 1 2 3 4。

说明

然看上去效果很酷,但是实际上据说这种用法的确很不安全,容易造成运行错误,所以还是尽量要少用。这种类似的问题如果能用重载或者类来解决的话还是少用可变参数函数吧。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

大佬总结

以上是大佬教程为你收集整理的c语言基于stdarg.h的可变参数函数的用法全部内容,希望文章能够帮你解决c语言基于stdarg.h的可变参数函数的用法所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。