为了账号安全,请及时绑定邮箱和手机立即绑定

在尝试用const初始化变量时出错“初始化器元素不是常量”

在尝试用const初始化变量时出错“初始化器元素不是常量”

C++ C
郎朗坤 2019-06-09 16:49:03
在尝试用const初始化变量时出错“初始化器元素不是常量”我在下面的程序的第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的内容进行初始化?也许我只需要改变我的策略,让一个初始化函数在启动时完成所有的副本。除非有其他的想法?
查看完整描述

3 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

在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若要创建命名聚合初始化器,请执行以下操作。


查看完整回答
反对 回复 2019-06-09
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

这是语言的限制。第6.7.8/4节:

具有静态存储持续时间的对象的初始化程序中的所有表达式都应该是常量表达式或字符串文本。

在第6.6节中,规范定义了必须视为常量表达式的内容。它不说明Const变量必须被视为常量表达式。编译器对此进行扩展是合法的(6.6/10 - An implementation may accept other forms of constant expressions但这将限制可移植性。

如果你能改变my_foo所以它没有静态存储,您可以:

int main(){
    foo_t my_foo = foo_init;
    return 0;}


查看完整回答
反对 回复 2019-06-09
  • 3 回答
  • 0 关注
  • 788 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信