时间:2021-05-20
C++编程中实现可变参数函数有多种途径,本文介绍一种最常见的实现途径,即可变参数宏方法:形参生命为省略符,函数实现时用参数列表宏访问参数。
1. 可变参数宏实现变参函数
可变参数宏实现可分为以下几个步骤:
上述步骤的实现需要使用到四个宏:
va_list 是在C语言中解决变参问题的一组宏
void va_start(va_list ap, last_arg)ap :是一个 va_list 类型的对象,它用来存储通过 va_arg 获取额外参数时所必需的信息。
last_arg :是最后一个传递给函数的已知的固定参数,即省略号之前的参数。
宏定义:type va_arg (va_list ap, type)
该宏用于变参数函数调用过程中,type是当前参数类型,调用该宏后,ap指向变参数列表中的下一个参数,返回ap指向的参数值,是一个类型为type的表达式。 ap是arg_ptr参数指针之意。
void va_end(va_list ap)允许使用了 va_start 宏的带有可变参数的函数返回。如果在从函数返回之前没有调用 va_end,则结果为未定义。
这些宏在头文件stdarg.h中声明定义。因此使用时需要包含该头文件。
下面给出用法示例:
#include <stdarg.h>//可变参数函数sum(),求任意个数整数的和。//Step1: 函数形参原型中给出省略符int Sum(int count, ...);int Sum(int count, ...) { //Step2: 函数实现中声明一个va_list可变参数列表变量; va_list ap; //Step3: 开始初始化构造va_list变量, 第二个参数为最后一个确定的形参 va_start(ap, count); int sum = 0; for(int i = 0; i < count; i++) { //读取可变参数,的二个参数为可变参数的类型 sum += va_arg(ap, int); } //清理工作 va_end(ap); return sum;}实际中使用可变参数宏实现C++可变参数函数编程,还要注意一下几点:
2. 更安全的可变参数函数实现方法
对于上面示例代码中count传进的实参如果与后面...省略符对应的实际参数数量不一致时,可能导致函数风险。这一切完全依赖运行时的具体情况而定,很不安全。
另一种更安全的可变参数宏实现方法是利用C++的 attribute ((format()))特性来辅助可变参数的检查。
最常见的形式是有如下两个:
__attribute__((format(printf, m, n))) __attribute__((format(scanf, m, n)))其中参数m与n的含义为:
m:第几个参数为格式化字符串(format string);
n:参数集合中的第一个,即参数“…”里的第一个参数在函数参数总数排在第几;
attributeformat属性可以给被声明的函数加上类似printf或者scanf的特征,它可以使编译器检查函数声明和函数实际调用参数之间的格式化字符串是否匹配。format属性告诉编译器,按照printf, scanf等标准C函数参数格式规则对该函数的参数进行检查。这在我们自己封装调试信息的接口时非常的有用。
format的语法格式为:
format (archetype, string-index, first-to-check)
其中,“archetype”指定是哪种风格;“string-index”指定传入函数的第几个参数是格式化字符串;“first-to-check”指定从函数的第几个参数开始按上述规则进行检查。
下面给出2个示例:
一般函数:
为自己定义的一个带有可变参数的函数,其功能类似于printf:
extern void myprint(const char *format,...) attribute ((format(printf,1,2))); //m=1;n=2extern void myprint(int l,const char *format,...) attribute ((format(printf,2,3))); //m=2;n=3类成员函数
需要特别注意的是,如果myprint是一个函数的成员函数,那么m和n的值可有点“悬乎”了,例如:
extern void myprint(int l,const char *format,...) attribute ((format(printf, 3,4 )));其原因是,类成员函数的第一个参数实际上一个隐身的this指针。
到此这篇关于C++可变参数函数实现的文章就介绍到这了,更多相关C++可变参数函数实现内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
C语言的printf函数,参数的数量可以是可变的。使用va_start和va_end实现。C++中,实现参数可变,可以用overload。如果参数数量不是很多的
千万要注意,C不支持默认参数C/C++支持可变参数个数的函数定义,这一点与C/C++语言函数参数调用时入栈顺序有关,首先引用其他网友的一段文字,来描述函数调用,
本文实例讲述了php可变长参数处理函数。分享给大家供大家参考,具体如下:与C++一样,PHP中也可以对含有可变参数的函数进行处理,道理都一样,需要函数来专门处理
C语言编程中有时会遇到一些参数个数可变的函数,本文详细讲解了可变参数函数的实现原理,分享给大家在开始学习C语言的函数的时候,我们就知道函数的参数个数应该是在函数
(一)写一个简单的可变参数的C函数下面我们来探讨如何写一个简单的可变参数的C函数.写可变参数的C函数要在程序中用到以下这些宏:复制代码代码如下:voidva_s