可变宏参数个数和可变函数参数个数

 可变宏参数个数

#define PR(X, ...) printf("Message X" __VA_ARGS__)
符号(...)对应后面的预定义的宏(__VA_ARGS__),如果有多个参数,省略号必须作为最后一个参数,第一个参数为‘X’,后面可以接个数可变的参数。

可变函数参数个数

要实现函数参数个数可变,需要头文件(stdarg.h)和以下步骤:

  1. 在函数原型中使用省略号
  2. 在函数定义中创建一个va_list类型的变量
  3. 用宏将该变量初始化为一个参数列表
  4. 用宏访问这个参数列表
  5. 用宏完成清理工作

同可变宏参数一样,如果有多个参数,省略号也同样必须作为最后一个参数。

void f1 (int n, ...);
int f2 (int n, const char * s, ...);
上面例子中,参数n表示省略号部分代表的参数个数,用头文件stdargs.h中声明的 va_list类型定义一种数据对象来存放参数列表中省略号部分代表的参量,然后使用stdargs.h头文件中定义的宏 va_start()把参数列表复制到va_list变量中,用stdargs.h头文件中定义的宏 va_arg()来访问参数列表,第一次调用 va_arg()返回参数列表的第一项,下次调用返回参数列表的第二项,依次类推。使用stdargs.h头文件中定义的宏 va_end()来完成清理工作。

例子

[clef@rhel6164 test]$ cat test5.c
#include <stdio.h>
#include <stdarg.h>
double sum(int, ...);

int main(void)
{
    double s, t;

    s = sum(3, 1.1, 2.5, 13.3);
    t = sum(6, 1.1, 2.1, 13.1, 4.1, 5.1, 6.1);
    printf("return value for sum(3, 1.1, 2.5, 13.3):%g\n", s);
    printf("return value for sum(6, 1.1, 2.1, 13.1, 4.1, 5.1, 6.1):%g\n", t);

    return 0;
}

double sum(int lim, ...)
{
    va_list ap;
    double tot = 0;
    int i;
    va_start(ap, lim);
    for(i = 0; i < lim; i++)
        tot += va_arg(ap, double);
    va_end(ap);

    return tot;
}
编译&执行
[clef@rhel6164 test]$ gcc ./test5.c -std=c99
[clef@rhel6164 test]$ ./a.out
return value for sum(3, 1.1, 2.5, 13.3):16.9
return value for sum(6, 1.1, 2.1, 13.1, 4.1, 5.1, 6.1):31.6

友情链接:C语言类函数宏和一般函数的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值