博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
可变参数列表
阅读量:3926 次
发布时间:2019-05-23

本文共 1483 字,大约阅读时间需要 4 分钟。

点击上方蓝字关注我,我们一起学编程

欢迎小伙伴们分享、转载、私信、赞赏

微信搜索:编程笔记本

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

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

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

#include 
using 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)&param1 + 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))

    将 list 指向可变参数列表的第一个参数

  • #define va_arg(list, type) ((type*)(list += sizeof(type)))[-1]

    按 type 指定的类型取一个参数,并移动 list 指向下一个参数

  • #define va_end(list) (list = (va_list)0)

    将 list 置零

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

微信搜索:编程笔记本

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

你可能感兴趣的文章
【gRPC】 在.Net core中使用gRPC
查看>>
整合.NET WebAPI和 Vuejs——在.NET单体应用中使用 Vuejs 和 ElementUI
查看>>
“既然计划没有变化快,那制订计划还有个卵用啊!”
查看>>
C#实现网页加载后将页面截取成长图片
查看>>
C# 在自定义的控制台输出重定向类中整合调用方信息
查看>>
C# 9 新特性 —— 补充篇
查看>>
Asp.Net Core使用Skywalking实现分布式链路追踪
查看>>
浅谈CLR基础知识
查看>>
Xamarin使XRPC实现接口/委托远程调用
查看>>
如何成功搞垮一个团队?
查看>>
.NET开源5年了,这些宝藏你还没get?
查看>>
【日常排雷】 .Net core 生产环境appsetting读取失败
查看>>
从内存中释放Selenium chromedriver.exe
查看>>
如何在 C# 中使用 MSMQ
查看>>
小试elsa
查看>>
巧用 Lazy 解决.NET Core中的循环依赖关系
查看>>
微前端架构在容器平台的应用
查看>>
C# 中的 null 包容运算符 “!” —— 概念、由来、用法和注意事项
查看>>
仓储模式到底是不是反模式?
查看>>
【One by One系列】IdentityServer4(一)OAuth2.0与OpenID Connect 1.0
查看>>