C语言解决变参问题的va

    技术2022-07-10  90

    以下内容来自于百度百科以及https://www.cnblogs.com/bwangel23/p/4700496.html的总结。

    首先理解_INTSIZEOF 宏的作用

    :获取类型占用的空间长度,最小占用长度为int的整数倍。意思就是n的长度是1-4,那获取的长度就是4,若是5-8,获取的长度就是8,依次类推,宏定义如下,可以尝试带入不同的n尝试。 #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

    va_list:

    #ifdef _M_ALPHA typedef struct { char a0; / pointer to first homed integer argument / int offset; / byte offset of next parameter */ } va_list; #else typedef char * va_list; #endif _M_ALPHA是指DEC ALPHA(Alpha AXP)架构。所以一般情况下va_list所定义变量为字符指针。

    va_start:

    va_start宏,获取可变参数列表的第一个参数的地址(ap是类型为va_list的指针,v是可变参数最左边的参数): #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )

    va_arg:

    va_arg宏,获取可变参数的当前参数,返回指定类型并将指针指向下一参数(t参数描述了当前参数的类型): #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

    va_end:

    va_end宏,清空va_list可变参数列表:#define va_end(ap) ( ap = (va_list)0 )

    一般使用方式:

    void func(char *fmt, ...){ va_list ap; va_start(ap, fmt); va_arg(ap, int); va_end(ap); }

    首先定义一个参数指针 ap, 然后利用va_start(),将ap指向第一个无名参数,再然后利用va_arg(), 将当前指向的参数提取出来,并强制转换成指定类型,此时就可以对提取出的参数做一些你所需的操作(有多个可变参数时,可多次调用va_arg()来提取参数). 最后利用va_end释放ap.

    Processed: 0.010, SQL: 9