You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用&运算符实现可变参数列表?能否使用va_copy?

问题解答

首先明确:va_copy无法解决你的需求。它的作用是复制va_list对象,用于保存可变参数列表的遍历位置,和是否需要使用&运算符传递地址完全无关。

针对你想避免写&的需求,分两种场景给出可行方案:

1. C++环境下的彻底解决

C++的引用特性可以直接替代指针实现外部变量修改,无需显式取地址:

方案一:重载函数(单参数场景)

针对不同类型分别实现重载版本,调用时直接传变量名即可:

void list_test(int index, int& var) {
    var = GetNumber(index);
}

void list_test(int index, bool& var) {
    var = GetEnable(index);
}

调用示例:

list_test(0, var_int);   // 无需写&
list_test(0, var_bool);  // 无需写&

方案二:模板参数包(多参数场景)

如果需要一次传递多个不同类型的变量,用模板参数包实现批量处理:

#include <type_traits>

template<typename... Args>
void list_test(int start_index, Args&... args) {
    int current_idx = start_index;
    // 逐个匹配类型并赋值
    ( [&](){
        if constexpr (std::is_same_v<std::decay_t<decltype(args)>, int>) {
            args = GetNumber(current_idx++);
        } else if constexpr (std::is_same_v<std::decay_t<decltype(args)>, bool>) {
            args = GetEnable(current_idx++);
        }
    }(), ... );
}

调用示例:

list_test(0, var_int, var_bool);  // 无需写&,自动处理每个变量

2. C语言环境下的语法简化

C语言没有引用特性,无法完全避免传递地址,但可以用宏做语法糖,让调用时不用显式写&:

// 定义递归宏自动为每个参数添加&
#define ADD_ADDR(var) &var
#define FOR_EACH(func, first, ...) func(first) FOR_EACH_NEXT(func, __VA_ARGS__)
#define FOR_EACH_NEXT(func, first, ...) , func(first) FOR_EACH_NEXT(func, __VA_ARGS__)
#define FOR_EACH_NEXT(func)

// 封装后的调用宏
#define LIST_TEST(index, ...) list_test(index, FOR_EACH(ADD_ADDR, __VA_ARGS__))

调用示例:

LIST_TEST(0, var_int, var_bool);  // 等价于list_test(0, &var_int, &var_bool)

这种方式只是语法层面的简化,本质还是传递地址,但调用时不用手动写&。

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 08:31:16