创建结构并在main之外分配值时,Initializer元素不是常量

时间:2013-01-24 14:31:18

标签: c

这是我的代码。我在主要的

之外写了这个部分
typedef struct { int x; } foo;
const int bar = 2;
foo myFoo = { (int) bar };

但是这会返回:

common.c:6: error: initializer element is not constant
common.c:7: error: (near initialization for ‘myFoo.x’)

如果我将代码复制并粘贴到主文件中,它将起作用。 有人可以给我一个解释吗?

2 个答案:

答案 0 :(得分:1)

你可以使用enum之类的:

typedef struct { int x; } foo;
enum {bar = 2};
foo myFoo = { bar }; 

使用#define bar 2喜欢

#define bar 2
typedef struct { int x; } foo; 
foo myFoo = { bar }; 

但两者在编译时都知道:为什么不知道?

typedef struct { int x; } foo; 
foo myFoo = { 2 }; 
const int bar = 2

答案 1 :(得分:1)

C 2011 6.6 6:

  

整数常量表达式应具有整数类型,并且只能具有整数常量的操作数,枚举常量,字符常量,结果为整数常量的sizeof表达式,_Alignof表达式以及作为强制转换的直接操作数的浮动常量。整数常量表达式中的转换运算符只能将算术类型转换为整数类型,除非作为sizeof或_Alignof运算符的操作数的一部分。

C 2011 6.7.9 4:

  

具有静态或线程存储持续时间的对象的初始值设定项中的所有表达式都应为常量表达式或字符串文字。

当您在main主体内定义对象时,它具有自动存储持续时间(仅在main正在执行时才存在)。在全局范围内定义对象时,在任何函数之外,它具有静态存储持续时间(在程序的生命周期内存在)。

自动对象可以包含非常量,因为它们在程序运行时被初始化。因此程序可以执行计算或从其他对象获取值来计算值。在执行程序之前,静态对象的初始值应该是可用的,以便它们可以构建到程序映像中。虽然对于人类来说很明显,您的示例中的myFoo的初始值可以在编译时计算出来,但这需要在编译器中进行额外的工作,这在C标准中是不值得的。