struct中的C ++ unsized数组,错误:“太多初始值设定项”

时间:2018-03-11 22:07:00

标签: c++ arrays struct arduino initialization

struct led {
  const int loc;
  int state;
  unsigned int stateDuration [];
  int stateMode;
  unsigned long timestamp;
  } led1 = {D0, 0, {500}, 0, 0},
    led2 = {D7, 0, {100, 900, 400}, 0, 0};

这给了我一个编译错误“太多的初始值设定项”(数组大小为0)。是否可以在结构中声明一个未大小的数组,然后使用不同的值(如我的示例)初始化它,或者我是否必须将数组显式声明为所需的最大大小?

2 个答案:

答案 0 :(得分:2)

将未知绑定数组作为结构的非静态成员是非法的。 [class.mem] / 13

  

非静态数据成员不得有不完整的类型。

这是因为当达到右括号时必须知道类的大小。

也许你应该stateDuration改为std::vector<unsigned int>

答案 1 :(得分:2)

您可以使用GCC,使用其C ++语言扩展,但只能使用结构的最后一个元素,因为字段的偏移必须是常量。 请参阅:https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

  

GCC允许灵活数组成员的静态初始化。这相当于定义一个包含原始结构的新结构,后跟一个足够大小的数组来包含数据。例如。在下文中,f1被构造为好像它被声明为f2。

struct f1 {
  int x; int y[];
} f1 = { 1, { 2, 3, 4 } };

如果您正在使用其他东西,您仍然可以实现这个想法,但只能使用堆分配的对象(因此初始化程序块不可能),您将需要一个自己的new运算符来处理动态的部分。 (也许delete也许,我不确定)