Site Overlay

Linux C 笔记:通俗解释可变参数的实现

首先介绍四个东西:

  1. va_list
  2. va_start
  3. va_arg
  4. va_end

我先不说定义,先看例子。

如果我们有一个函数:

int sum(int i1, ...);

我要实现把给的所有参数相加,要怎么做呢?

显然,我们要知道每个参数的值。

问题是我们只能直接得到 i1 的值,后面的怎么办呢?

要获得值,本质上就是要获得它的地址对应的内容。

这个时候 va_start 闪亮登场。我们假设有 va_list ap;,你不需要知道 va_list 是个什么东西。你只要知道 va_start(i1) 能让 ap 指向函数的第一个可变参数的地址。

有了地址,我们就能获取对应的内容。怎么做呢?这个时候可以用 va_arg(ap, int),它的作用就是提取 ap 对应地址的数据,并以 int 形式返回(其他类型同理)。我们只要接收这个函数的返回值即可。

不过,由于无法判断是否读完,我们得把 i1 改成 count,表示变量数量。

最后要做一点收尾工作。执行 va_end() 让 ap 指针归零。

我们最终的代码如下

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

int sum(int count, ...)
{
    va_list ap;
    va_start(ap,count);
    int sum = 0;
    while (count > 0)
    {
        --count;
        sum+=va_arg(ap, int);
    }
    return sum;

}

int main()
{
    printf("%d\n", sum(5,1,2,3,4,5));
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注