Compiler construction 切换C编译器原因:无法为灵活数组成员指定错误初始值设定项

Compiler construction 切换C编译器原因:无法为灵活数组成员指定错误初始值设定项,compiler-construction,Compiler Construction,我试图将我们的代码从一个IDE转换为另一个IDE。当前的一个使用gcc,它允许从变量数组初始化此结构。新工具不使用gcc,这给了我一个错误:无法为灵活数组成员指定初始值设定项。有人能帮我理解如何设置吗?我是否应该设置一个大小可变的空白数组,然后在某处指定define数组,如下所示 下面是一个代码示例…这是当前IDE的当前实现 在一个可构建切换的头文件中,我们可以在不同的硬件平台上构建它,定义如下 #define GPIOS \ /* BANK, PIN, SPD,

我试图将我们的代码从一个IDE转换为另一个IDE。当前的一个使用gcc,它允许从变量数组初始化此结构。新工具不使用gcc,这给了我一个错误:无法为灵活数组成员指定初始值设定项。有人能帮我理解如何设置吗?我是否应该设置一个大小可变的空白数组,然后在某处指定define数组,如下所示

下面是一个代码示例…这是当前IDE的当前实现

在一个可构建切换的头文件中,我们可以在不同的硬件平台上构建它,定义如下

#define GPIOS  \ 
          /*     BANK, PIN, SPD,  MODE,…  */
      GPIOINIT(   A,   0,   2,   AIN,  …) \
      GPIOINIT(   A,   1,   2,   AIN,  …) \
      GPIOINTINIT(A,   2,   2,   AIN,  …) \
      .
      .
      .
然后在我们所有构建中使用的不同头文件中

  PLATFORM_CONFIG_T g_platformConfig = {
          .name = {PLATFORM_NAME},

          (bunch of other stuff),

         .allGpios = {
                     GPIOS /* here I get the error */
         },
   };

所以我想我可以把错误行做成一个变量数组,然后用其他方式分配给它?问题是实际阵列GPIO的类型不同,不同设计上的引脚顺序也不同。

使用聚合初始化灵活阵列成员是一个gcc扩展。好消息是,由于您是静态分配g_platformConfig,因此不需要该成员是灵活的数组:您可以选择固定大小的数组

很可能在代码中的某个地方有一个常量的定义,表示GPIOS数组中有多少项。否则,您需要依赖排序的哨兵值,类似于C字符串的null终止符,以了解合法GPIOS值的结束位置。如果已经有了该常量,请将allGpios的定义修改为

而不是

gpoinit_t allGpios[]; // flexible array
有了此更改,您的代码应该能够正确编译


如果你没有GPIOOH计数常量,可以考虑添加一个,或者引入一个限制在AlgPiOS中的项目数量的最大值。无论哪种方式,将阵列转换为非灵活阵列都将修复错误。

我们有不同的硬件配置。我不确定各平台的数字是否一致。我可能能够分配最大的一个和浪费空间,否则,但这可能会导致其他问题时,通过IO的循环。。。因为我现在只是想让它为一个版本工作,所以我会尝试一个固定数组,但我不认为这解决了我的问题。此外,如果我不能做到这一点,它可能会阻止我们使用这个IDE…或者我们必须重新安排代码,使其也是一个特定于产品的结构。-谢谢though@user1054210如果基于平台有条件地定义了GPIO,则可以将GPIO_计数的定义放入同一个条件块中。这可以让您在很少改动的情况下避免错误。另外,我可能没有说清楚,但是define GPIO是一个不一致数组的数组。GPIOINIT大于GPIOINIT。define GPIO有许多包含的行,如上图所示,它们在不同的设计中是不一致的。是的,这就是我所想的,让我们试试……不,这不起作用,但我认为它有不同的问题,所以我做错了什么。谢谢你。我想我知道如何解决这个问题了,我只需要多做几件事就行了。我相信实际的结构比我描述的要复杂一点,这就是我遇到问题的地方。很清楚,是的……这确实修复了这个错误。将大小固定为常量可以消除使用变量的错误。我不想在特定于平台的文件中添加更多独特的内容,但我会为这次评估做准备。由于一些非常愚蠢的事情,它现在仍然无法编译。我会解决的,谢谢你的帮助。
gpoinit_t allGpios[]; // flexible array