在编写参数可变的函数的时候要用到
va_list
va_start
va_arg
va_end
这几个宏,在stdarg.h中有这几个宏的定义,在看这几个宏定义的时候
有各地方不太理解,就是下面的这个宏定义#define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )哪位大侠能给小弟讲一讲这个是什么意思!
谢谢!

解决方案 »

  1.   

    定义_INTSIZEOF(n)主要是为了某些需要内存的对齐的系统.C语言的函 
    数是从右向左压入堆栈的,图(1)是函数的参数在堆栈中的分布位置.我 
    们看到va_list被定义成char*,有一些平台或操作系统定义为void*.再 
    看va_start的定义,定义为&v+_INTSIZEOF(v),而&v是固定参数在堆栈的 
    地址,所以我们运行va_start(ap, v)以后,ap指向第一个可变参数在堆 
    栈的地址,如图: 高地址|-----------------------------| 
    |函数返回地址 | 
    |-----------------------------| 
    |....... | 
    |-----------------------------| 
    |第n个参数(第一个可变参数) | 
    |-----------------------------|<--va_start后ap指向 
    |第n-1个参数(最后一个固定参数)| 
    低地址|-----------------------------|<-- &v 
    图( 1 ) 然后,我们用va_arg()取得类型t的可变参数值,以上例为int型为例,我 
    们看一下va_arg取int型的返回值: 
    j= ( *(int*)((ap += _INTSIZEOF(int))-_INTSIZEOF(int)) ); 
    首先ap+=sizeof(int),已经指向下一个参数的地址了.然后返回 
    ap-sizeof(int)的int*指针,这正是第一个可变参数在堆栈里的地址 
    (图2).然后用*取得这个地址的内容(参数值)赋给j. 高地址|-----------------------------| 
    |函数返回地址 | 
    |-----------------------------| 
    |....... | 
    |-----------------------------|<--va_arg后ap指向 
    |第n个参数(第一个可变参数) | 
    |-----------------------------|<--va_start后ap指向 
    |第n-1个参数(最后一个固定参数)| 
    低地址|-----------------------------|<-- &v