[TOC]
## 实现一个可以接受变参的函数
在函数参数列表中使用 `...` 表示接受可变参数:
```c++
int add_nums(int count, ...) ;
```
结合 `cstdarg` 中提供的一些系统函数,可以实现对可变参的操作:
```c++
int add_nums(int count, ...) {
int result = 0;
std::va_list args;
va_start(args, count);
for (int i = 0; i < count; ++i) {
result += va_arg(args, int);
}
va_end(args);
return result;
}
void my_print(const char* format, ...) {
std::va_list argp;
va_start(argp, format);
vprintf(format, argp);
va_end(argp);
}
int main() {
my_printf("%d\n", add_nums(4, 25, 25, 50, 50));
return 0;
}
```
## 透传可变参变量
```c++
#include <utility>
void my_print(const char* format, ...) {
// do nothing
}
template <class... U>
int print_wrapper(const char* format, U&&... u) {
my_print(format, std::forward<U>(u)...);
return 0;
}
```
## 检查参数格式
使用 `__attribute__ ((format()))` 可以让函数在编译期间检查参数类型:
```c++
void my_print(const char* format, ...)
__attribute__ ((format(printf, 1, 2))); // 检查 my_format的第1、2参数是否满足printf
void my_print(const char* format, ...) {
va_list argp;
va_start(argp, format);
vprintf(format, argp);
va_end(argp);
}
```
## 相关文档
- [cppreference-va-list](https://en.cppreference.com/w/cpp/utility/variadic/va_list)
- 目录
- 基础知识
- 1、变量和基础类型
- 1.1、内置类型
- 1.2、变量
- 1.3、复合类型
- 1.4、类型修饰符
- 1.5、类型处理
- 1.6、自定义结构
- 1.7、数组
- 2、表达式和语句
- 2.1、运算符
- 2.2、语句
- 3、函数
- 1、语法相关
- 2、资源管理
- 3、面向对象
- 4、模板与泛型编程
- Problem01:判断类中是否包含函数
- Problem02:解析函数的参数类型
- 5、系统库
- Problem01:多线程维护最大值
- Problem02:介绍一下strcpy、strncpy、memcpy、memmove
- Problem03:介绍一下网络编程
- Problem04:select、poll、epoll的区别
- 未整理
- Problem11:实现在main函数前、后执行的函数
- Problem12:可变参函数的实现
- Problem13:全局变量初始化顺序问题
- Problem14:介绍一下隐式转换
- Problem07:实现一个不能被拷贝的类
- Problem08:实现一个只能通过动态、静态分配的类
- 开源项目
- redis
- 第一部分 数据结构与对象
- redis 底层数据结构
- redis 对象
- taskflow
- 数据结构
- Executor
