Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1611864
  • 博文数量: 695
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4027
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-20 21:22
文章分类

全部博文(695)

文章存档

2018年(18)

2017年(74)

2016年(170)

2015年(102)

2014年(276)

2013年(55)

分类: C/C++

2014-04-09 11:05:34

#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 ;
}

阅读(307) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~