小编典典

尝试使用 const 初始化变量时出现错误“初始化元素不是常量”

all

我在以下程序的第 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 的内容进行初始化?

也许我只需要改变我的策略,并有一个初始化函数在启动时完成所有副本。除非有其他想法?


阅读 61

收藏
2022-06-15

共1个答案

小编典典

在 C 语言中,具有静态存储持续时间的对象必须使用 常量表达式 或包含常量表达式的聚合初始值设定项进行初始化。

“大”对象在 C 中绝不是常量表达式,即使该对象被声明为const.

此外,在 C 语言中,术语“常量”指的是 文字常量 (如1'a'0xFF)、枚举成员和诸如sizeof.
常量限定的对象(任何类型)在 C 语言术语中 不是常量。 无论它们的类型如何,它们都不能用于具有静态存储持续时间的对象的初始化程序。

例如,这 不是 一个常数

const int N = 5; /* `N` is not a constant in C */

以上N将是 C++ 中的常量,但它不是 C 中的常量。因此,如果您尝试这样做

static int j = N; /* ERROR */

你会得到同样的错误:试图用非常量初始化一个静态对象。

这就是为什么在 C 语言中,我们主要使用#define来声明命名常量,并求助于#define创建命名聚合初始值设定项。

2022-06-15