list定义的是什么类型?
C语言参数从右到左进栈,栈的增长方式是从高地址往低地址,所以在栈空间里面,参数排布非常整齐而有规律,从第一个参数开始,按参数大小紧密排列;当读取可变参数的时候,一般来说一定至少有一个不可变的参数,取最后一个不可变参数的地址,加上这个参数的大小,就是下一个可变参数的起始地址,之后按参数的类型添加相应的位移,依次取出这些参数。这就是可变参数的原理。va_list等宏实际上也是这么做的。所以如果想要用自定义的可变参数来调用vprintf,可以自己分配一段空间,然后依次将想要传入的可变参数填充到这个空间中,最后把这个空间的地址强制转换为va_list然后传给vprintf。在大多数架构上,va_list是个简单的指针类型。
用va_xxx的宏应该也是可以的不保证在其他奇奇怪怪的架构上也都能用不过还是那句话,何必呢,正常情况下都不如对每个参数调用一次printf……