我在以下程序的第 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
。
此外,在 C 语言中,术语“常量”指的是文字常量(如 1
、'a'
、 0xFF
等)、枚举成员以及 sizeof
等运算符的结果。在 C 语言术语中,Const 限定对象(任何类型)不是常量。它们不能用于具有静态存储持续时间的对象的初始值设定项,无论其类型如何。
例如,这不是常量
const int N = 5; /* `N` is not a constant in C */
上面的N
在C++中是一个常量,但在C中不是一个常量。所以,如果你尝试这样做
static int j = N; /* ERROR */
您将得到相同的错误:尝试用非常量初始化静态对象。
这就是为什么在 C 语言中,我们主要使用 #define
来声明命名常量,并使用 #define
创建命名聚合初始值设定项。
关于c - 尝试使用 const 初始化变量时出现错误 "initializer element is not constant",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37496230/