c - 非常大的 C 结构的分段初始化

标签 c struct constants initializing

我的嵌入式应用程序存储(在 ROM 中,const)非常大,非常嵌套的结构。 我正在寻找一种简洁的方法来初始化它。 所以改为写:

typedef struct {
    uint32_t    n1;
    float       fArr[5];
    struct {
        char    cArr[1000];
        int32_t n3;
    }subStruct;
    // ... and on and on 
}Config_t;

const Config_t cfg = {
    .n1 = 5,
    .fArr = {1.0, 2.0, 0, -5.6, 8.8},
    .subStruct.cArr = {1,1,1,2,2,2,3,3,3/*etc*/},
    .subStruct.n3 = 3
};

使用类似的东西:

const float fArrAux[5] = { 1.0, 2.0, 0, -5.6, 8.8 };
const char cArrAux[1000] = { 1,1,1,2,2,2,3,3,3/*etc*/ };

const Config_t cfg = {
    .n1 = 5,
    .fArr = fArrAux,            // ?
    .subStruct.cArr = cArrAux,  // ?
    .subStruct.n3 = 3
};

是否有推荐的方法来做到这一点,以便主要结构在内存中保持连续(不包括成员填充)(它在闪存中,所以我想一次性刻录它)。

此外,这种设置中的辅助定义(fArrAux、cArrAux)是否会消耗内存(因此占用空间加倍)?

谢谢

最佳答案

如果你只是想在视觉上分离长数组初始化器,你可以考虑将它们定义为宏:

#define CFG_FARR             { 1.0, 2.0, 0, -5.6, 8.8 }
#define CFG_SUBSTRUCT_CARR   { 1, 1, 1, 2, 2, 2, 3, 3, 3, /*etc*/ }

const Config_t cfg = {
    .n1 = 5,
    .fArr = CFG_FARR,
    .subStruct.cArr = CFG_SUBSTRUCT_CARR,
    .subStruct.n3 = 3
};

关于c - 非常大的 C 结构的分段初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48049143/

相关文章:

c++ - `std::string(strerror(errno))` 危险吗?

c - 使用复合文字来初始化 malloc 的缓冲区,

c - 错误 : expected ‘:’ , ‘,’、 ‘;’、 ‘}’ 或 ‘__attribute__’ token 之前的 ‘=’

c - 字符串中的只读变量在 for 循环 C 中不可分配

string - golang 在编译时删除常量字符串中的字符(用于可读性)(空格,\n 和\t)

连接 C 字符串

c - 在 C 中将变量记录到文件中

c - 对递增数组进行排序

c - 使用 char** 数组作为结构成员加载/填充结构,c

c++ - 你会把 C++ RValue 引用参数标记为 const