Windows/Linux C语言如何实现可变参数的函数
前言
在Windows/Linux中,C语言是可以实现可变参数的函数的,使用va_list系列宏,在C中可以定义可变参数列表,包含可变参数信息,从而实现函数的可变参数。
va_list系列宏
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);
s = sum(3,2,3,4,5);
printf(sum = %d\n, s);
return 0;
}
运行结果:
tmp = -1392657952
sum = 9
sum = 14
例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
更新于:2个月前赞一波!
相关文章
- PHP 函数传值和传引用的区别
- PHP 可变函数
- 解释函数 foo() {} 和 var foo = function() {} 之间 foo 用法的差异
- linux shell的几种截取字符串的方法
- JavaScript 常用自定义功能函数
- PHP 常用功能函数
- Linux中date命令如何格式化输出需要的时间格式
- 使用Docker Wine Qemu KVM在Linux运行Windows应用
- PHP的数组排序函数
- Debian Linux国内常用镜像源
- CentOS7安装unzip解压工具命令使用方法
- Linux使用Docker部署.NET6网站图文教程
- Linux中通过命令连接指定WiFi
- TP6.0 助手函数 env()
- PHP的七个数组指针函数
- Vue组件的data必须是一个函数、单个根元素、局部组件
- 什么是宝塔Linux
- Nginx配置文件(nginx.conf)配置参数详解
- PHP 创建目录函数封装
- Linux 删除文件或目录 rm 命令
文章评论
全部评论