我在以下程序的第 6 行(将 my_foo 初始化为 foo_init)出现错误,我不确定我是否理解原因。
typedef struct foo_t { int a, b, c; } foo_t; const foo_t foo_init = { 1, 2, 3 }; foo_t my_foo = foo_init; int main() { return 0; }
请记住,这是我正在处理的一个更大的多文件项目的简化版本。目标是在目标文件中有一个常量,多个文件可以用来初始化一个状态结构。因为它是一个资源有限的嵌入式目标,而且结构不是那么小,所以我不想要源的多个副本。我不想使用:
#define foo_init { 1, 2, 3 }
我也在尝试编写可移植的代码,所以我需要一个有效的 C89 或 C99 解决方案。
这是否与目标文件中的 ORG 有关?初始化变量进入一个 ORG 并通过复制第二个 ORG 的内容进行初始化?
也许我只需要改变我的策略,并有一个初始化函数在启动时完成所有副本。除非有其他想法?
在 C 语言中,具有静态存储持续时间的对象必须使用 常量表达式 或包含常量表达式的聚合初始值设定项进行初始化。
“大”对象在 C 中绝不是常量表达式,即使该对象被声明为const.
const
此外,在 C 语言中,术语“常量”指的是 文字常量 (如1、'a'等0xFF)、枚举成员和诸如sizeof. 常量限定的对象(任何类型)在 C 语言术语中 不是常量。 无论它们的类型如何,它们都不能用于具有静态存储持续时间的对象的初始化程序。
1
'a'
0xFF
sizeof
例如,这 不是 一个常数
const int N = 5; /* `N` is not a constant in C */
以上N将是 C++ 中的常量,但它不是 C 中的常量。因此,如果您尝试这样做
N
static int j = N; /* ERROR */
你会得到同样的错误:试图用非常量初始化一个静态对象。
这就是为什么在 C 语言中,我们主要使用#define来声明命名常量,并求助于#define创建命名聚合初始值设定项。
#define