请选择 进入手机版 | 继续访问电脑版
查看: 59|回复: 0

[工作经验] 基于C语言中的不定参数分析

[复制链接]

签到天数: 193 天

[LV.7]化身百千

发表于 2019-3-6 19:06:20 | 显示全部楼层 |阅读模式
不定参数是指函数可以接收不确定个数的参数,不定参数用...来表示,它必须要写在正常参数表的后面,例如我们熟知的printf函数:

int printf (char *fmt, ...);

        printf的第一个参数为char* fmt,后面则是不定参数。它表示可以接收任意个数的参数。我们在调用这样的函数时可以向其传与任意个数的参数,例如:

printf("%d %d\n", 1, 2);
printf("%f %f %f\n", 1.2, 2.3, 3.4);
printf("%d %f %c %s\n", 1, 2.3, 'A', "Hello World!");

        那么,我们不禁要问,定义了一个不定参数的函数,在函数体内如何确定其形参呢?如何取得传入参数的值呢?

        C语言中提供了一种可以获取不定参数的办法,就是用std_arg

        先来看看std_arg的使用例子:

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

int sum(int first, ...)
{
        va_list arg_list;
        int sum = first;
        va_start(arg_list, first);
        int var2 = va_arg(arg_list, int);
        int var3 = va_arg(arg_list, int);
        int var4 = va_arg(arg_list, int);
        int var5 = va_arg(arg_list, int);
        sum += var2;
        sum += var3;
        sum += var4;
        sum += var5;
        va_end(arg_list);
        return sum;
}

int main(int argc, char *argv[])
{
        printf("%d\n", sum(1, 2, 3, 4, 5));
        return 0;
}

        首先,我们要使用#include <stdarg.h>来包含这个使用否定参数的头文件。然后定义一个int类型的变量,我们需要使用va_start将函数的第一个参数传递给arg_list,这样它都才会知道其后面的不定参数。接下来使用va_arg来取得第二个参数值,在取值时需要将其强制转化为指定类型的变量。在这里我们是认为参数的类型均为int型,而通常来说我们可以向printf这样,将第一个参数做为后续不定参数的类型定义,通过分析fmt字符串中的类型来确定后续不定参数的类型。接下来我们通过va_arg再取得第三个参数、第四个参数和第五个参数。最后使用va_end结束不定参数的使用。

        当然,在定义函数和调用函数时我们都必须清楚函数的所有的参数类型,否则arglist将不能正常工作。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /2 下一条

返回顶部