ZHCU876Z July 2001 – October 2023 SM320F28335-EP
没有显式初始化的 const 类型的静态和全局变量与其他静态和全局变量类似,因为它们可能不会被预初始化为 0(原因在节 6.13中讨论过)。例如:
const int zero; /* might not be initialized to 0 */
但是,const 全局变量的初始化是不同的,因为这些变量是在名为 .econst 或 .const(取决于 ABI)的段中进行声明和初始化的。例如:
const int zero = 0 /* guaranteed to be 0 */
对于 COFF,这对应于 .econst 段中的一个条目:
.sect .econst
_zero
.word 0
对于 EABI,这对应于 .const 段中的一个条目:
.sect .const
zero
.word 0
这个特性对于声明一个大型常量表特别有用,因为在系统启动时既不会浪费时间也不会浪费空间来初始化表。另外,链接器可用于在 ROM 中放置 .econst 或 .const 段。
您可以使用 DATA_SECTION pragma 将变量放置在 .econst 或 .const 之外的段中。例如,以下 C 代码:
#pragma DATA_SECTION (var, ".mysect")
const int zero=0;
is compiled into this assembly code (in COFF mode):
.sect .mysect
_zero
.word 0