C语言变长参数的认识以及宏实现

1.认识

变长参数是C语言的特殊参数形式,例如如下函数声明:

int printf(const char *format, ....);

如此的声明表明,printf函数除了第一个参数类型为const char*之外,其后可以追加任意数量、任意类型的参数。

printf的实现,粗略地举个例子。

假设lastarg是变长参数函数的最后一个具名参数(例如printf里的format),那么在函数内部定义类型的va_list的变量:

va_list ap;

该变量以后将会依次指向各个可变参数。ap必须用宏va_start初始化一次,使其指向第一个不定参数,其中lastarg必须是函数的最后一个具名参数。

va_start(ap, lastarg);

此后,可以使用va_arg宏来获取当前不定参数的值,并根据当前不定参数的类型将指针移向下一个参数(假如已其其类型为type):

type current = va_arg(ap, type);

在函数结束前,必须用宏va_end来清理现场。

变长参数的实现得益于C语言默认的cdecl调用惯例的自右向左压栈传递方式,个中细节不作详述。接下来用宏来实现变长参数。

2.宏实现

你可能感兴趣的:(C语言变长参数的认识以及宏实现)