【问题标题】:C/C++ Inline coercion of array of pointers (void**)指针数组的 C/C++ 内联强制 (void**)
【发布时间】:2019-10-25 12:22:13
【问题描述】:

我正在使用一个库函数,它在某些时候需要一个指针数组 (void**),它或多或少像这样工作。

void* args[] = { &var_a, &var_b, &var_c, ... };
someFunction(args);

使用一次后,我想再次调用同一个函数,所以我要做的是创建另一个变量,例如:

void* args_2[] = { &var_d, &var_e, &var_f, ... };
someFunction(args_2);

等等……

我想找到一种回收args符号的方法,这样我就不必每次调用它时都执行args_2、args_3、args_4;但是当我尝试重新分配它时:

args = { &var_d, &var_e, &var_f, ... };

我得到以下信息:

error: assigning to an array from an initializer list

我理解错误,但我不知道如何避免它或将这个东西强制转换为预期的指针数组类型。

我知道它们是两种不同的语言,但我正在寻找一种适用于 C 和 C++ 的解决方案。

【问题讨论】:

  • C 还是 C++?有区别。
  • 我可以接受在这两种情况下都适用的答案。另外,@NathanOliver 你能告诉我更多关于有什么不同的地方吗?
  • 使用std::vector<void *>,它确实支持从初始化列表构造。用作someFunction(args.data());
  • 如果你想要 C 或 C++ 的解决方案,我建议提出两个单独的问题,因为解决方案本质上是不同的(C 可以做 C++ 不能做的事情,反之亦然)。如果您不在乎,那么我建议您只使用一种语言。如果你必须掷骰子,但我建议使用 C++,因为你可以简单地使用 std::vector
  • @almosnow 好吧,不,这是一个神话。 kiran 的答案是仅限 C,而我的答案是仅限 C++(即使您使用 typedef)。现在呢?

标签: c++ c initializer-list coercion


【解决方案1】:

如果您只需要一次调用someFunction,为什么还要使用局部变量?

using args = void *[];

someFunction(args{&a, &b});
someFunction(args{&a, &b, &c});

或者,C++ 使用包装器对其进行更多处理:

template <class... T>
decltype(auto) someFunction(T *... args) {
    void *args_[] { args... };
    return someFunction(args_);
}

someFunction(&a, &b);
someFunction(&a, &b, &c);

【讨论】:

  • 谢谢昆汀,我只是快速测试一下,会回来的。
【解决方案2】:

您可以使用下面的复合文字和指针。

void** args = (void *[]){ &var_a, &var_b, &var_c, ... };

args = (void *[]){ &var_d, &var_e, &var_f, ... };

【讨论】:

  • 感谢基兰!在精神上我正在寻找这样的东西,但是,它没有编译:由于“错误:获取临时数组的地址”。我也理解,嗯,怎么能避免呢?
  • @almosnow 这可能会帮助你stackoverflow.com/questions/32941846/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
相关资源
最近更新 更多