切换C编译器导致:无法为灵活的数组成员指定错误初始值设定项

时间:2012-09-19 15:23:20

标签: compiler-construction

我正在尝试将我们的代码从一个IDE转换为另一个IDE。当前使用gcc,允许从变量数组初始化此结构。新工具不使用gcc给我一个错误“无法为灵活的数组成员指定初始化程序”。那么有人可以帮我理解如何设置它吗?我应该设置一个可变大小的空白数组,然后在某处分配#define数组,如下所示?

以下是代码示例...(这是当前实现的当前IDE)

在一个可转换的头文件中,我们可以在不同的硬件平台上构建它,我们有以下#define

#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”属于不同类型,不同设计的引脚顺序不同。

1 个答案:

答案 0 :(得分:0)

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

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

gpoinit_t allGpios[GPIO_COUNT]; // regular array

而不是

gpoinit_t allGpios[]; // flexible array

有了这个改变,你的代码应该正确编译。

如果您没有GPIO_COUNT常量,请考虑添加一个,或引入MAX_GPIO值来限制allGpios中的项目数。无论哪种方式,将数组转换为非灵活数组都将修复错误。