点击上方蓝字关注我,我们一起学编程
欢迎小伙伴们分享、转载、私信、赞赏
微信搜索:编程笔记本
微信搜索:编程笔记本
微信搜索:编程笔记本
今天给大家分享在 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)¶m1 + 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 置零
最后,我补充一句,这几个宏之所以能工作,得益于一个性质:传入函数的参数,在内存空间上是紧密相邻的。只有这样,才能从命名参数后接着寻找可变参数。
微信搜索:编程笔记本
微信搜索:编程笔记本
微信搜索:编程笔记本