我有这个结构
typedef struct {
int Length;
int Data[];
} MyStruct;
此宏用于初始化结构
#define FillStruct(...) { .Length = sizeof((int[]){__VA_ARGS__}), .Data = {__VA_ARGS__} }
所以我可以用
初始化结构MyStruct Obj = FillStruct(1, 2, 3, 4, 5);
但这不起作用。我收到此错误:
柔性数组成员的非静态初始化
将Obj
更改为static
初始化时,我可以编译代码
static MyStruct Obj = FillStruct(1, 2, 3, 4, 5);
但是现在调试器为我提供了有关该对象的一些奇怪信息。
那么我该如何解决这个问题?我正在寻找一种解决方案,以在嵌入式设备(AVR MCU)上的编译期间初始化此结构。在这种情况下,我不能使用带有malloc
等的解决方案。并且此结构中的数据是恒定的,并存储在程序存储器中。因此,应用程序仅读取此数据。
答案 0 :(得分:1)
我找到了一个解决方案。编译器抛出此错误,因为我在main
内声明并初始化了结构。将此段移出main
将解决此问题。
最终解决方案如下:
#define VA_NARGS_IMPL(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) 2 * N
#define VA_NARGS(...) VA_NARGS_IMPL(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
#define FillStruct(...) { .Length = VA_NARGS(__VA_ARGS__), .Data = {__VA_ARGS__} }
const MyStruct Obj = FillStruct(1, 2, 3, 4, 5);
int main(void)
{
int B = Obj.Data[2];
// B = 3
}
所以现在一切都很好。似乎错误的调试器输出也出现在const
关键字中。但是现在我可以删除const
和static
来在结构中获取相应的Length
(但不能Data
)。