C99标准下ARMCC、GNU编译器如何将Flash静态大数组初始化为全-1
C99下ARMCC/GNU编译器静态const数组全-1初始化方案
注意:标准C99规定如果初始化列表提供的元素数量少于数组长度,剩余元素会被自动初始化为零值,因此
static const int my_array[1024] = {-1};的写法只会将第一个元素设为-1,其余都是0,无法满足需求。
- GNU GCC 编译器可直接使用GNU扩展的范围指定初始化语法,编译后直接生成全-1的只读数据存入Flash:
static const int my_array[1024] = {[0 ... 1023] = -1};
语法说明:方括号内[起始下标 ... 结束下标]表示匹配该区间内的所有数组元素,统一赋值为右侧的常量,注意...前后必须加空格避免语法解析错误。
ARMCC编译器(包括ARM Compiler 5/armcc、ARM Compiler 6/armclang)完全兼容上述GNU风格的范围初始化语法,无需额外修改即可跨编译器使用。
若要求完全遵循C99标准不使用编译器扩展,可通过预处理器宏批量生成初始化值,该方案适合数组长度不超过预处理器展开上限的场景:
示例简单嵌套宏实现(可根据数组长度扩展宏嵌套层级):
#define REPEAT2(x) x, x #define REPEAT4(x) REPEAT2(x), REPEAT2(x) #define REPEAT8(x) REPEAT4(x), REPEAT4(x) // 逐级扩展到REPEAT1024(x) static const int my_array[1024] = {REPEAT1024(-1)};
额外提示:上述所有针对const静态数组的初始化方案均为编译期完成,生成的数组会直接分配到Flash的只读数据段,不会占用RAM,也不需要运行时操作,完全符合Flash存储的需求。不要尝试用
memset等运行时函数修改const数组,Flash存储的只读数据运行时写入会触发硬件异常。
内容的提问来源于stack exchange,提问作者Submin
相关产品推荐
相关产品推荐

