用宏初始化结构

时间:2019-10-25 12:47:35

标签: c struct

我有这个结构

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);

但是现在调试器为我提供了有关该对象的一些奇怪信息。

enter image description here

那么我该如何解决这个问题?我正在寻找一种解决方案,以在嵌入式设备(AVR MCU)上的编译期间初始化此结构。在这种情况下,我不能使用带有malloc等的解决方案。并且此结构中的数据是恒定的,并存储在程序存储器中。因此,应用程序仅读取此数据。

1 个答案:

答案 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关键字中。但是现在我可以删除conststatic来在结构中获取相应的Length(但不能Data)。