c - 使用宏初始化结构体

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

但这行不通。我收到此错误:

non-static initialization of a flexible array member

当我将 Obj 更改为 static 初始化时,我可以编译代码

static MyStruct Obj = FillStruct(1, 2, 3, 4, 5);

但是现在调试器给了我一些关于这个对象的奇怪信息。

enter image description here

那么我该如何解决这个问题呢?我正在寻找一种解决方案,以在嵌入式设备(AVR MCU)上的编译时初始化该结构。在这种情况下,我无法使用 malloc 等解决方案。并且此结构中的数据是常量并存储在程序内存中。所以应用程序只读取这些数据。

最佳答案

我找到了一个解决方案。编译器抛出此错误,因为我在 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)。

关于c - 使用宏初始化结构体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58558827/

相关文章:

c - C语言动态内存链表语法错误

c - 如何访问函数中的结构成员并将其作为 void* 类型?

python - 将 Python 中的二进制文件读入结构

c - 有没有评论功能在Doxygen中的实现

c - 按位运算符的幂 2 的模数?

C-Mysql-警告 : assignment from incompatible pointer type

go - 消失的结构组件的赋值

Python struct.pack() 在脚本中不起作用

c - C 中的结构内部列表 - 显示链接列表中存在的结构的成员

ios - 如何在 swift 5 中解析具有不同数据的响应字符串