我在一个嵌入式微控制器上用C语言工作,并试图用一组常量结构声明和初始化(在ROM中)一个常量结构,这个非常简单的例子说明了这一点:

typedef struct s_test TestStruct;
struct s_test {
   char c;
   int const * const ptr;
};

TestStruct const test1 = { 'a', NULL };

TestStruct const test2 = { 'a', (const int const []){ 2, 3, NULL } };

实例test1按预期占用ROM,而在实例test2的情况下,子数组最终在RAM中(不是ROM,按预期)。
如果我声明一个中间数组,然后使用对该数组的引用,结构和数组实例将按预期占用ROM。。。
int const array1[] = { 1, 2, NULL };

TestStruct const test3 = { '1', array1 };

为什么,当我在结构初始化中声明和初始化数组时,子数组会存储在RAM而不是ROM中也许我的语法不正确有成功的方法吗它将使数据结构的声明和初始化更加可读,而不必转发声明所有中间子数组最初我以为我是如此聪明地声明我的数据结构,但后来非常失望地发现它在很大程度上占用了RAM:\

最佳答案

单词const并不意味着该值存储在ROM中,而是意味着该值在初始化后不应该改变RAM中可以有const的对象编译可以决定是否放入ROM,这取决于优化器是否试图保存RAM,但没有什么可以保证它将某物投射到const更弱您的{2,3,NULL}在创建时不是const
您需要阅读编译器的手册,并找出如何将对象放入ROM(或者可能是闪存)中有些编译器有一个关键字来执行此操作,例如您使用的code__rom而不是const
另一种方法是在链接器文件中创建一个新的“节”,并将所有ROM变量放在该节中。
不幸的是,没有一种标准的方法可以做到这一点。

关于c - 参照const数组初始化const struct中的const数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24278621/

10-11 22:33
查看更多