C 函数可变参数

C 函数可变参数

C 语言中用 ... 表示可变参数,例如:

void fun(int x ...)

头文件 cstdarg.h 中包含可变参数类型va_list和处理可变参数的三个宏:

  • va_list 实际上是char*类型
  • va_start(ap,v),确定可变参数的起始地址,该宏定义为:
#define va_start _crt_va_start
#define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
  • va_arg(ap,type),根据type类型取参数地址,该宏定义为:
#define va_arg _crt_va_arg
#define _crt_va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
  • va_end(ap),将可变参数地址置为0
#define va_end _crt_va_end
#define _crt_va_end(ap)      ( ap = (va_list)0 )

例子:

#include <iostream>
#include <cstdarg>

using namespace std;

/*
可变参数函数
*/

void error(int x ...){
	va_list arg;
	va_start(arg, x);
	while (true){
		char* p = va_arg(arg, char*);
		if (p == NULL) break;
		cout << p << endl;
	}
	va_end(arg);
}
int main(){
	error(1, "hello", "world", "haha",NULL);//要使用NULL来标记参数列表尾
	return 0;
}

posted on 2016-06-06 21:40  shaolw  阅读(243)  评论(0编辑  收藏  举报

导航