NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
[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)