我正在尝试将我们的代码从一个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”属于不同类型,不同设计的引脚顺序不同。
答案 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
中的项目数。无论哪种方式,将数组转换为非灵活数组都将修复错误。