可变参数列表

点击上方蓝字关注我,我们一起学编程
欢迎小伙伴们分享、转载、私信、赞赏

微信搜索:编程笔记本
微信搜索:编程笔记本
微信搜索:编程笔记本

今天给大家分享在 C/C++ 中可变参数列表的两种实现方式。

在 C++11 中,引入了初始化列表 initializer_list 新特性,这让我们可以十分方便地对函数传入不定数量的参数(需用 { } 括起来)。

#include <bits/stdc++.h>
using namespace std;

int Sum(initializer_list<int> nums)
{
	int sum = 0;

	for (auto num : nums) {
		sum += num;
	}

	return sum;
}

int main()
{
	cout << Sum({1, 2}) << endl;    // 3
	cout << Sum({2, 3}) << endl;    // 5

	return 0;
}

微信搜索:编程笔记本
微信搜索:编程笔记本
微信搜索:编程笔记本

在 C 语言中,头文件 stdarg.h 中有以下四个宏用于处理可变参数列表:

typedef char *va_list;
#define va_start(list, param1) (list = (va_list)&param1 + sizeof(param1))
#define va_arg(list, mode)     ((mode*)(list += sizeof(mode)))[-1]
#define va_end(list)           (list = (va_list)0)

让我们先测试一下:

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


int Sum(int n, ...) {
	int sum = 0;
	va_list arg;

	va_start (arg, n);
	for (int i = 0; i < n; ++i) {
        sum += va_arg(arg, int);
    }
	va_end (arg);

	return sum;
}

int main()
{
	int s1 = Sum(2, 1, 2);
	int s2 = Sum(3, 1, 1, 2);

    printf("%d, %d\n", s1, s2);    // 3, 4

	return 0;
}

在使用这几个宏处理不定参数列表时,我们需要设置一个命名参数,用于接收参数数量,因为这些宏无法获知参数数量。

下面我们仔细分析一下这几个宏。

  • #define va_start(list, nparam) (list = (va_list)&nparam+ sizeof(nparam))
    将 list 指向可变参数列表的第一个参数

  • #define va_arg(list, type) ((type*)(list += sizeof(type)))[-1]
    按 type 指定的类型取一个参数,并移动 list 指向下一个参数

  • #define va_end(list) (list = (va_list)0)
    将 list 置零

最后,我补充一句,这几个宏之所以能工作,得益于一个性质:传入函数的参数,在内存空间上是紧密相邻的。只有这样,才能从命名参数后接着寻找可变参数。

微信搜索:编程笔记本
微信搜索:编程笔记本
微信搜索:编程笔记本

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值