【问题标题】:C++ specify array indexes in initializer, like CC++ 在初始化程序中指定数组索引,如 C
【发布时间】:2012-11-26 10:28:25
【问题描述】:

我以前用过 C(嵌入的东西),我可以像这样初始化我的数组:

int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

即我可以在初始化程序中指定索引。 目前我正在学习Qt/C++,我不敢相信这在 C++ 中不受支持。

我有这个选项:-std=gnu++0x,但无论如何它不受支持。 (我不知道 C++11 是否支持它,因为 Qt 与 gcc 4.7.x 一起工作有问题)

那么,C++ 真的不支持吗?或者也许有办法启用它?

UPD:目前我想初始化 const 数组,所以 std::fill 不起作用。

【问题讨论】:

  • "或者也许有办法启用它?" - 使用 C? (:D) 好问题,+1。
  • 你的代码既不是C(包括C11)。 C11 不支持以这种方式初始化范围 ([a...b]=1),仅支持单个元素 ([a]=1)。
  • hmm...你能在声明周围使用extern "C" { ................ }吗?但我相信这个语法是你嵌入式编译器的补充。
  • @anishsane “我相信这个语法是你的嵌入式编译器的补充”——不,它是 C99 的 GNU 扩展。
  • @ybungalobill 同样,这是一个 GNU 扩展。

标签: c++ c


【解决方案1】:

嗯,你应该使用 std::fill_n() 来完成那个任务......

如此处所述http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html 指定的初始化(扩展)未在 GNU C++ 中实现

编辑:取自这里:initialize a const array in a class initializer in C++

正如评论所说,您可以使用 std:vector 来获得所需的结果。您仍然可以以另一种方式强制执行 const 并使用 fill_n。

int* a = new int[N];
// fill a

class C {
  const std::vector<int> v;
public:
  C():v(a, a+N) {}
};

【讨论】:

  • 感谢您的回答。实际上,我需要初始化 const 数组,所以,std::fill_n() 对我不起作用。
  • @DmitryFrank:使用std::vector,编写一个使用fill_n初始化向量并返回结果的函数。使用这个函数来初始化一个const vector。
  • 你还需要delete a;。两个动态分配填充数组,是不是有点矫枉过正?
  • 多年后,它在 g++ 4.8.2 中工作。 :) 编译时使用-std=c++11
【解决方案2】:

时隔多年,偶然测试了一下,可以确认在g++ -std=c++11,g++版本是4.8.2.

【讨论】:

    【解决方案3】:

    不,这样在 C++ 中是不可能的。但是您可以使用std::fill 算法来分配值:

    int widths[101];
    fill(widths, widths+10, 1);
    fill(widths+10, widths+100, 2);
    fill(widths+100, widths+101, 3);
    

    它没有那么优雅,但它确实有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多