贵阳市建设厅官方网站,域名解析错误无法上网,有什么网站可以做微信app,利于优化的wordpress模板Linux C语言 26-可变参数
本节关键字#xff1a;可变参数、va_list、va_arg、va_end 相关C库函数#xff1a;va_list、va_arg、va_end
什么是可变参数#xff1f;
C语言中的可变参数是指函数能够接受不定数量的参数。在不确定函数参数时#xff0c;使用“char *format, …Linux C语言 26-可变参数
本节关键字可变参数、va_list、va_arg、va_end 相关C库函数va_list、va_arg、va_end
什么是可变参数
C语言中的可变参数是指函数能够接受不定数量的参数。在不确定函数参数时使用“char *format, …”的方式提供多个参数的输入。可变参数的引入旨在解决
变参问题是指参数的个数不定可以是传入一个参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有实际的名称与之相对应。 因此当函数的参数个数不确定时就可以使用可变参数进行动态处理这样就打打增加了程序的灵活性。
相关宏和函数
#include stdarg.h
#define va_start(v,l) __builtin_va_start(v,l)
#define va_end(v) __builtin_va_end(v)
#define va_arg(v,l) __builtin_va_arg(v,l)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);int printf(const char *format, ...);
int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
int vsprintf(char *str, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap);va_list的使用
1在函数中定义一个具有va_list型的变量这个变量是指向参数的指针。 2用va_start宏初始化变量刚定义的va_list变量使其指向第一个可变参数的地址。 3va_arg返回可变参数va_arg的第二个参数是你要返回的参数的类型如果多个可变参数依次调用va_arg获取各个参数。 4最后使用va_end宏结束可变参数的获取。
在使用va_list是应该注意以下问题
可变参数的类型和个数完全由代码控制它并不能智能地识别不同参数的个数和类型。如果我们不需要一一详解每个参数只需要将可变列表拷贝到某个缓冲区可以用vsprintf函数。因为编译器对可变参数的函数原型检查不够严格对编程查错不利不利于我们写出高质量的代码。
va_list使用例程
#include stdio.h
#include stdlib.h
#include stdarg.h
#include time.hvoid myprint(const char *format, ...)
{char str[1024] {0};va_list vList;va_start(vList, format);vsprintf(str, format, vList);va_end(vList);printf(%s\n, str);
}int sum(char *format, ...)
{va_list vList;int nStep, sNum0;va_start(vList, format);printf(%s\n, format);while (nStep va_arg(vList, int)){// va_arg负责取出符合参数类型的下一个指针// 第一个参数时可变参数变量第二个参数是传入参数类型sNum nStep;}va_end(vList);return sNum;
}int main(int argc, char *argv[])
{int rc;time_t tnow time(0);struct tm *t localtime(tnow);myprint(%04d-%02d-%02d %02d:%02d:%02d %s\n, t-tm_year1900, t-tm_mon1, t-tm_mday, t-tm_hour, t-tm_min, t-tm_sec,this is va_list testing program.);rc sum(Hello World!, 1, 2, 3, 4);myprint(rc%d\n, rc);return 0;
}/** 运行结果
2023-11-24 16:57:01 this is va_list testing program.Hello World!
rc10*/