C语言如何写一个变参函数?

头文件stdarg.h

想要在C语言中写变参函数,首先要知道va_list,va_start,va_arg,va_end,它们都包含在头文件stdarg.h中。

  1. va_list 为数据类型,用于定义储存参数列表的地址的指针变量。
  2. va_start为宏定义,作用是将第一个参数后的地址赋给va_list类型定义的指针变量。
  3. va_arg 为宏定义,作用是取出参数列表的参数值。
  4. va_end为宏定义,作用是将va_list类型定义的指针变量指向空地址。
  5. 在stdarg.h头文件中,它们是被这样定义的:
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
typedef void *va_list
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) 
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) 
#define va_end(ap) ( ap = (va_list)0 ) 

目前我没有办法理解_INTSIZEOF(n)是做什么的,在本篇博客中只讲讲如何定义一个变参函数。

定义一个变参的加法函数

#include <stdio.h>
#include <stdarg.h>
int easy_sum(int numbers,...) {
    int result = 0;
    va_list argumen;//定义参数列表的指针变量
    va_start(argumen, numbers);//将第一个可选参数地址赋给参数列表的指针变量
    while(numbers--) {
        result += va_arg(argumen,int); //取出当前指针变量所指内存空间的参数值,然后将下一个参数的地址赋给指针变量。
    }
    va_end(argumen);
    return result;
}

int main() {
    int n = 4;
    printf("%d\n", easy_sum(n,3,5,7,9));
    return 0;
}

C语言定义变参函数的缺点

  1. 想要所有入参都是有意义的,即在函数中用到所有入参,则变参函数的第一个参数必须能够用于在函数体中得出一共有多少个入参。比如我上面所写的加法函数,第一个入参n就是多少个数值相加;还有系统的printf函数,它的第一个入参是字符串,字符串中的占位符就能够指出有多少个其他入参。
  2. va_arg想要使用获得参数的数值,是需要提前知道当前参数的数据类型才行。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值