C++传递不定参函数
C++ 函数 传递 不定
2023-09-11 14:18:44 时间
定义不定参数函数,要用到下面这些宏:
- va_start(ap, farg): 初始化一个va_list变量ap,farg是第一个形参
- va_arg(ap, type): 获取(下)一个type类型的参数
- va_end(ap): 结束使用ap
C语言里编写不定参数函数的形式是这样的:
#include <stdarg.h>
int sum(int cnt,...) {
int sum = 0;
int i;
va_list ap;
va_start(ap, cnt);
for(i = 0; i < cnt; ++i)
sum += va_arg(ap, int);
va_end(ap);
return sum;
}
定义不定参数函数,要用到下面这些宏:
- va_start(ap, farg): 初始化一个va_list变量ap,farg是第一个形参
- va_arg(ap, type): 获取(下)一个type类型的参数
- va_copy(ap): 用于复制参数列表
- va_end(ap): 结束使用ap
这些宏定义一般在stdarg.h
里。
typedef char * va_list;
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap) ( ap = (va_list)0 )
注意: 上面这些宏定义会因不同的系统和不同的处理器架构而不同
_INTSIZEOF宏
_INTSIZEOF这个宏的位运算意义比较难理解,乍一看以为是表示多少个int型的长度,其实它运算出来的结果是按照int型对齐后的长度。比如int型为4个字节,_INTSIZEOF(1)、_INTSIZEOF(2)、_INTSIZEOF(3)、_INTSIZEOF(4)的结果都是4,_INTSIZEOF(5)、_INTSIZEOF(6)、_INTSIZEOF(7)、_INTSIZEOF(8)的结果都是8,这正是x86架构CPU下的参数传递方式,32位即4字节对齐。
几个注意事项
- 不定参数的函数至少要有一个固定的参数,因为要用它来初始化va_list,比如上面代码中sum函数的cnt参数,同时它也表明了传递的参数的个数。
常用方式
不定参数函数最常用来格式化字符串,一个比较常见的场景是我们想输出一些log消息,但又不能直接在控制台输出,需要自己写一个log函数来格式化log消息并输出。这时我们可以用vsprintf函数:
void log(const char *format, ...) {
char buf[MAX_BUF_SIZE];
va_list ap;
va_start(ap, format);
vsprintf(buf, format, ap);
OUTPUT(buf);
}
vsprintf函数的前两个参数和sprintf的前两个参数意义相同,只不过后面的不定参换成了va_list类型的参数列表,这正是让我们用来定义自己的格式化函数的。
https://www.cnblogs.com/luzhlon/p/7087080.html
相关文章
- [系统安全21]源码免杀、C++壳的编写
- [C++]VAssistX函数添加注释功能设置
- C++ code:剩余串排列
- (C++)STL排序函数sort和qsort的用法与区别
- (笔试题)关于C++的虚函数和多态性
- C++ 调用windows系统DOS命令的函数 system(char* command)
- C/C++每日一练(20230414)
- C/C++基础讲解(十八)之数据结构篇二叉树遍利与浮点数转换为字符串
- C++ 在函数中使用静态局部变量,让函数返回数组
- 《C++ Primer》 第四版 第7章 函数
- 【软件安装】c++11安装
- 【华为OD机试 2023】 优秀学员统计(C++ Java JavaScript Python)
- 遇到个C++ MAP问题,有谁会的么?
- c++函数式编程 笔记
- c++ 函数签名
- c++ 纯虚函数和抽象类那些事(二)实现抽象类
- c++构造函数详解
- PAT 1134 C++ 版
- c++之iostream迭代器用法超详细整理!!!
- 一键抠图Portrait Matting人像抠图 (C++和Android源码)
- C++基础知识要点--函数(Primer C++ 第五版 · 阅读笔记)
- C++的学习心得和知识总结 第二章|C++函数基础:默认值、内联和const及函数重载