C va_arg()

va_arg() 是在 stdarg.h 头文件中定义的**宏**。这个**宏**有助于从函数的参数列表中获取带类型的下一个参数。但该函数无法确定检索到的参数是否为最后一个参数。


type va_arg(va_list ap, type); #where ap is the object of va_list

 

va_arg() 参数:

va_arg() 函数接受两个参数。参数 'ap' 包含检索带有状态的额外参数所需的信息。在 va_start 的初始调用和 va_arg 的第一次调用之前,此 'ap' 对象被初始化。

参数 描述 必需/可选
ap va_list 的对象,它将保存信息 必需
type 类型名称用作表达式的类型,此宏扩展为 必需

va_arg() 返回值

宏 va_arg() 返回带有表达式类型的下一个参数列表。我们可以多次调用 va_arg 宏从列表中检索参数。

输入 返回值
如果参数 下一个参数列表

 

va_arg() 示例

示例 1: va_arg() 函数在 C 语言中的工作原理?


#include <stdio.h>
#include <stdarg.h>

int getsum(int, ...);

int main () {
   printf("Sum of 23 and 45 is %d\n",  getsum(2, 23, 45) );
   return 0;
}

int getsum(int num_args, ...) {
   int value = 0;
   va_list ap;
   int i;

   va_start(ap, num_args);
   for(i = 0; i < num_args; i++) {
      value += va_arg(ap, int);
   }
   va_end(ap);
 
   return value;
}

输出


Sum of 23 and 45 is 68

示例 2: va_arg() 在 C 语言中如何工作?


#include <stdio.h>
#include <stdarg.h>

void runcode (int i, ...)
{
    va_list pntr;
    va_start(pntr, i);

    if (i == 0)
    {
        int n = va_arg(pntr, int);
        printf("%d\n", n);
    }
    else
    {
        char *s = va_arg(pntr, char*);
        printf("%s\n", s);
    }

    va_end(pntr);
}

int main()
{
    runcode(0, 0xFFFFFFFF); // 0xffffffff is not an int
    runcode(1, NULL);       // NULL is not a char*
}

输出


-1

(null)