C++ 变长参数

本文介绍了一个使用可变参数列表的C++函数示例。该函数通过va_list、va_start、va_arg及va_end宏来处理不定数量的整数参数,并计算它们的总和。文章展示了如何利用这些宏进行迭代求和,直到遇到结束标志。

一个典型的过程是

int sum(char *msg, ...)
{
    va_list st;
    va_start(st, msg);
    int total = 0;
    int tmp;
    while((tmp = va_arg(st, int)) != 0)
    {
        total += tmp;
    }
    va_end(st);
    cout << "The sum of the list is: " << total;
    return 0;
}

由于sum函数自身是不知道有几个参数的,只知道可变参数的首地址是&msg + sizeof(char)。

### C++变长参数的用法 在 C++ 中,处理变长参数有两种主要方式:传统的 `...` 和现代的模板技术。 #### 使用传统省略号 (`...`) 实现变参函数 C 风格的传统方法允许定义接受不定数量参数的函数。这类函数至少有一个已命名参数,在其后跟随逗号和三个点(`...`)来表示后续可能存在的任意多个额外实参[^1]。 ```cpp #include <cstdarg> #include <iostream> double average(int count, ...) { va_list args; double sum = 0; va_start(args, count); for (int i = 0; i < count; ++i) { sum += static_cast<double>(va_arg(args, int)); } va_end(args); return count > 0 ? sum / count : 0; } ``` 此代码片段展示了如何创建一个计算平均数的简单例子。通过调用标准库中的宏如 `va_start`, `va_arg` 及 `va_end` 来访问传递给该函数的实际参数列表。 #### 利用模板实现更安全灵活的变参支持 自 C++11 起引入了可变模版参数(variadic templates),这使得编写能够接收不同类型的参数成为可能,并且提供了编译期检查的优势[^3]。 ```cpp template<typename T, typename... Args> void print(T first, Args... rest) { std::cout << first << ", "; if constexpr(sizeof...(rest)) { print(rest...); // Recursively call with remaining arguments. } } // Usage example: print(1, "two", true, 4.5f); ``` 上述示例中展示了一个递归展开剩余参数包的方式打印所有传入值的方法。这种方法不仅限于基本数据类型;还可以用于对象或其他复杂结构体,只要它们重载了相应的流插入运算符即可。 对于预处理器指令方面,虽然存在一些限制——比如不允许在特定上下文中使用某些特殊标记(例如 `__VA_OPT__`),但这并不影响大多数开发者日常编码实践中的变参功能应用[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值