可变参数_两个open函数

问题来源

查找系统调用open函数,发现存在同名函数,可是C语言没有函数重载的概念。

image

代码层面分析

从代码中跳转到open函数声明,看到了变参函数,这样就符合C语言的语法规则了。

image
image

可变参数

  • 参数需要具备一定特征
    • 第一个参数为参数总个数
    • 第N个参数为NULL或其他具有代表性的值
  • 参数从右向左入栈,然后ret、ebp入栈,寻找参数时,ebp-8是从左数第一个参数,因此可以根据第一个参数来循环获取所有参数,或者使用循环知道某个参数满足特征时跳出。
#include <stdio.h>
#include <stdarg.h>
int add(int count, ...)
{
    int i = 0;
    int sum = 0;

    va_list args;
    va_start(args, count);

    for (; i < count; ++i)
    {
        int arg = va_arg(args, int);
        sum += arg;
    }

    va_end(args);
    return sum;
}

int main()
{
    printf("%d\n", add(3, 4, 3, 2));
    return 0;
}

posted @ 2023-04-17 19:56  Qing-Huan  阅读(33)  评论(0编辑  收藏  举报