linux C 可变参数类型va_list
2022/4/3 7:19:36
本文主要是介绍linux C 可变参数类型va_list,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录- 常用的va_list系列宏
- va_list系列宏使用模式
- 例1:定义一个可变参数的求和函数
- 例2:定义一个自定义打印字符串函数
可变函数参数,会用到va_list系列宏,在C中用于定义可变参数列表,包含可变参数信息。
常用的va_list系列宏
包含:
- va_start(ap, last)宏:初始化可变参数列表;
- va_arg(ap, type)宏:返回下一个参数;
- va_copy(dest, src)宏:复制参数列表指针,将dest初始化为src;
- va_end(ap)宏:结束使用可变参数列表,会清空参数列表,置参数ap无效;
其声明如下:
#include <stdarg.h> void va_start(va_list ap, last); type va_arg(va_list ap, type); void va_end(va_list ap); void va_copy(va_list dest, va_list src);
例如,我们常用的C库函数printf,就用到了可变参数列表
#include <stdio.h> int printf(const char *format, ...);
形参列表里的 "..."代表0个或多个参数。
将可变参数由“...”转换为va_list类型形式,
#include <stdarg.h> int vprintf(const char *format, va_list ap);
va_list系列宏使用模式
对于自定义可变参数列表的函数,可用va_list系列宏,按如下模式对可变参数进行解析:
void func(type v, ...) { va_list(ap, v); // 定义一个指向个数可变的参数列表指针 va_start(ap, v); // 使指针ap指向函数参数列表的第一个可选参数,v是第一个可选参数之前的固定参数 while () { type tmp = va_arg(ap, type); // 返回参数列表中指针ap所指的参数,返回类型为type,并使指针ap指向下一个参数 } va_end(ap); // 清空参数列表,并置参数列表指针ap无效 }
例1:定义一个可变参数的求和函数
int sum(int v, ...) { int i = v; int s = 0; va_list ap; va_start(ap, v); while (i > 0) { s += va_arg(ap, int); i--; } // { volatile int tmp = va_arg(ap, int); // tmp是未知值 printf("tmp = %d\n", tmp); // } 用于测试 va_end(ap); return s; }
调用:
int main() { int s = sum(3,2,3,4); printf("sum = %d\n", s); return 0; }
运行结果:
tmp = -1392657952 sum = 9
例2:定义一个自定义打印字符串函数
void my_print(const char *fmt, ...) { char *s = fmt; va_list ap; va_start(ap, fmt); while (s != NULL) { printf("%s\n", s); s = va_arg(ap, char *); } va_end(ap); }
调用:
int main() { my_print("hello", "yes", "no"); return 0; }
运行结果:
hello yes no
这篇关于linux C 可变参数类型va_list的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-12如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows)
- 2024-11-08linux的 vi编辑器中搜索关键字有哪些常用的命令和技巧?-icode9专业技术文章分享
- 2024-11-08在 Linux 的 vi 或 vim 编辑器中什么命令可以直接跳到文件的结尾?-icode9专业技术文章分享
- 2024-10-22原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布
- 2024-10-18操作系统入门教程:新手必看的基本操作指南
- 2024-10-18初学者必看:操作系统入门全攻略
- 2024-10-17操作系统入门教程:轻松掌握操作系统基础知识
- 2024-09-11Linux部署Scrapy学习:入门级指南
- 2024-09-11Linux部署Scrapy:入门级指南
- 2024-08-21【Linux】分区向左扩容的方法