我在以下程序的第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
。const限定的对象(任何类型)在C语言术语中不是常量。无论它们的类型如何,都不能在具有静态存储持续时间的对象的初始化程序中使用它们。
例如,这不是常数
const int N = 5; /* `N` is not a constant in C */
上面的内容N
在C ++中是一个常量,但在C中不是常量。因此,如果尝试
static int j = N; /* ERROR */
您将得到相同的错误:尝试使用非常量初始化静态对象。
这就是为什么在C语言中,我们主要使用#define
来声明命名常量,并且还求助于#define
创建命名聚合初始化器的原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句