【问题标题】:error: too many initializers for 'tU8 [0] {aka unsigned char [0]}'错误:“tU8 [0] {aka unsigned char [0]}”的初始化程序太多
【发布时间】:2014-03-22 15:15:54
【问题描述】:

我在初始化作为结构数组的一部分的数组时遇到问题。 结构的类型是

typedef stuct {
   unsigned char myarray[]; 
   bool flag;
}myStructType;

我已经创建了一个这种结构类型的数组并想要初始化它

myStructType myStruct[2] = {
   {
      {5,6,7},
      false
   },
   {
      {1,2},
      true
   }
};

myStruct 是一个配置结构,我的代码将循环遍历结构的所有元素,根据初始值执行一些操作。

我在 Linux 嵌入式平台使用 arm-v5te-linux-gnueabi-g++ 编译器。

问题是当我编译代码时,我得到以下错误

错误:'unsigned char [0]' 的初始化程序太多

有什么解决办法吗? 谢谢

【问题讨论】:

  • 什么编译器和平台?这样的成员是非标准的。
  • 您不需要 C++ 中的 typedef struct { } name 技巧,您只需使用 struct name { }。您应该选择一种语言或另一种。
  • 如果您使用 C++ 编程,并且想要一个动态大小的数组,请使用 std::vector
  • 结构的目的是保存配置。我会在需要时向结构中添加更多事件。该设计将用于嵌入式解决方案。
  • @user2234576 好奇你为什么不接受这个答案;如果有更多信息使答案无效,它将帮助其他读者知道它是什么。

标签: c++ arrays initialization


【解决方案1】:

忽略编译器问题,考虑一下:

struct myStructType {
   unsigned char myarray[]; 
   bool flag;
};

myStructType a = { { 5, 6, 7 }, true };
myStructType b = { { 1, 2 }, true };

sizeof(myStructType) 是什么(或者更重要的是,flag 的偏移量是多少)?这是无法回答的,因为这种情况是不可能的。你有几个选择。您可以硬编码myarray 的最大大小:

struct myStructType {
   unsigned char myarray[4]; 
   bool flag;
};

您可以将其设为指针并分别初始化数组:

struct myStructType {
   unsigned char *myarray; 
   bool flag;
};

unsigned char a[] = { 5, 6, 7 };
unsigned char b[] = { 1, 2 };
myStructType myStruct[2] = { { a, true }, { b, false } };

您可以执行与上述相同的操作,但使用以空字符结尾的字符串:

struct myStructType {
   unsigned char *myarray; 
   bool flag;
};

unsigned char a[] = "\005\006\007";
unsigned char b[] = "\001\002";
myStructType myStruct[2] = { { a, true }, { b, false } };

或者直接,如果constmyarray没问题:

struct myStructType {
   const unsigned char *myarray; 
   bool flag;
};

myStructType myStruct[2] = { 
    { "\005\006\007", true }, 
    { "\001\002", false } 
};

还有其他选择。

顺便说一句,你不需要 C++ 中的 typedef struct { } name 语法,你可以直接使用 struct name { }

【讨论】:

  • 事实上,大小不定的数组被允许作为 C 中的成员。它们根本不参与sizeof。这个技巧在 C++ 中是非法的,但许多编译器还是允许这样做。但是,绝对不允许在这样的数组之后声明成员。
【解决方案2】:

我不知道有哪个编译器可以让你拥有这样的struct。它似乎不可能弄清楚如何访问flag

如果可以,请将 myarray 重构为另一个链接结构。

【讨论】:

    猜你喜欢
    • 2014-02-04
    • 2019-11-04
    • 2022-01-12
    • 1970-01-01
    • 2014-12-25
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多