天天看点

C语言可变长参数实现原理

博客:

微博:           

我们可以从c语言的printf得出可变参数的作用,printf函数的原型如下:

通过使用可变个数参数,就是传入的参数个数是可变的,如printf需要根据format实参传入多个实参。

下面一个函数myprintf是自己实现的比较简单的printf函数,不完整但是可以说明可变参数的用法。

程序的数据结果如下:

下面介绍c语言可变长度参数的实现,其实现与一个数据结构(va_list)和三个宏(va_start, va_end, va_arg)相关,从源码中可以看到这些实现下面的来自linux内核源码中的文件(include/acpi/platform/acenv.h)

 a)         va_list

从实现中可以看出va_list类型实际上就是一个指针;

b)        va_start

这个宏的作用是将t所指向的参数后面的内容放到ap中,其中_bnd (a,_aupbnd)是返回a的size并与系统的机器位数对齐,因为参数在栈中的地址一定是与系统的字长对齐的,其中acpi_native_int就表示机器字长;

c)         va_end

这个宏的作用就是返回0;

d)        va_arg

这个宏的作用是取得ap指向的当前的参数,并将ap指向参数列表中的下一个参数; 

继续阅读