C中的可变参数列表用法总结

来源:互联网 发布:网络彩票平台出租 编辑:程序博客网 时间:2024/04/29 06:49

首先头文件需要声明<stdarg.h>

函数的参数列表声明类似为char* fun(char* first,...)

1.函数定义中首先定义一个va_list类型的参数列表;

2.通过va_start宏进行参数列表的初始化,该宏的第一个参数为第一步定义的参数列表变量,第二个参数可变参数列表的前一个参数,也就是最后一个固定参数随后参数列表当前指向的参数就是可变列表的第一个参数。

3.通过va_arg扫描参数列表,第一个参数为第一步定义的参数列表变量,第二个参数为指定的参数类型。

4.通过va_end终止扫描(作用待探讨)。

下面是一个实例程序,摘自C语言的公共主页:

下面是一个把任意个字符串连接起来的函数, 结果存在malloc 的内存中: 
#include <stdlib.h> /* 说明malloc, NULL, size_t */ 
#include <stdarg.h> /* 说明va_ 相关类型和函数*/ 
#include <string.h> /* 说明strcat 等*/ 
char *vstrcat(const char *first, ...) 
{ 
size_t len; 
char *retbuf; 
va_list argp; 
char *p; 
if(first == NULL) 
return NULL; 
len = strlen(first); 
va_start(argpfirst); 
while((p = va_arg(argpchar *)) != NULL) 
len += strlen(p); 
va_end(argp); 
retbuf = malloc(len + 1); /* +1 包含终止符\0 */ 
if(retbuf == NULL) 
return NULL/* 出错*/ 
(void)strcpy(retbuffirst); 
va_start(argpfirst); /* 重新开始扫描*/ 
while((p = va_arg(argpchar *)) != NULL) 
(void)strcat(retbufp); 
va_end(argp); 
return retbuf; 
} 
调用如下: 
char *str = vstrcat("Hello, ""world!", (char *)NULL);
原创粉丝点击