#include
//类型的大小(多少字节,以int的4字节为标准,内存对齐)
#define __va_rounded_size(TYPE) \
(((sizeof(TYPE)+sizeof(int)-1)/sizeof(int))*sizeof(int))
//找到固定参数的位置,然后内存地址加上固定参数所占的字节数,就找到了第一个变参的地址了(参数传递,是右边的参数先压栈嘛)
#define va_start(AP,LASTARG) \
(AP=((char*)&(LASTARG)+__va_rounded_size(LASTARG)))
//返回参数位置指针所指的参数,并且指针指向下一个参数(移动到下一个参数地址)
#define va_arg(AP,TYPE) \
(AP += __va_rounded_size(TYPE),\
*((TYPE*)(AP-__va_rounded_size(TYPE))))
void test_va(int last_arg,...){
int num ;
printf("I am in test_va \n") ;
char* addr_arg
;
//参数位置指针(定义成char* 就是为了以char一字节为单位)
va_start(addr_arg,last_arg)
;
//让指针指向第一个变参(通过固定参数,因为在栈中,固参上边紧接挨着的就是第一个变参,在往上是第二个/第三个。。。。)
num = va_arg(addr_arg,int) ;
printf("the first va_arg is %d \n",num) ;
}
int main(){
test_va(34,56) ;//34是固定参数,56是变参数
return 0 ;
}
阅读(342) | 评论(0) | 转发(0) |