本文共 1483 字,大约阅读时间需要 4 分钟。
点击上方蓝字关注我,我们一起学编程
欢迎小伙伴们分享、转载、私信、赞赏微信搜索:编程笔记本
微信搜索:编程笔记本 微信搜索:编程笔记本今天给大家分享在 C/C++ 中可变参数列表的两种实现方式。
在 C++11 中,引入了初始化列表 initializer_list
新特性,这让我们可以十分方便地对函数传入不定数量的参数(需用 { }
括起来)。
#includeusing namespace std;int Sum(initializer_list 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#include 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))
#define va_arg(list, type) ((type*)(list += sizeof(type)))[-1]
#define va_end(list) (list = (va_list)0)
最后,我补充一句,这几个宏之所以能工作,得益于一个性质:传入函数的参数,在内存空间上是紧密相邻的。只有这样,才能从命名参数后接着寻找可变参数。
微信搜索:编程笔记本
微信搜索:编程笔记本 微信搜索:编程笔记本