努力奋斗的骚年!
分类: C/C++
2014-10-30 14:42:51
点击(此处)折叠或打开
下面让我们来看va_list等宏应该如何实现。
va_list实际是一个指针,用来指向各个不定参数。由于类型不明,因此这个va_list以void*或char*为最佳选择。
va_start将va_list定义的指针指向函数的最后一个参数后面的位置,这个位置就是第一个不定参数。
va_arg获取当前不定参数的值,并根据当前不定参数的大小将指针移向下一个参数。
va_end将指针清0。
按照以上思路,va系列宏的一个最简单的实现就可以得到了,如下所示:
#define va_list char*
#define va_start(ap,arg) (ap=(va_list)&arg+sizeof(arg))
#define va_arg(ap,t) (*(t*)((ap+=sizeof(t))-sizeof(t)))
#define va_end(ap) (ap=(va_list)0)