C语言变长參数的认识以及宏实现 1.认识 2.宏实现

变长參数是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.宏实现