1

这是我的代码。我在主要内容之外写了这部分

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’)

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

4

2 回答 2

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
于 2013-01-24T14:51:17.193 回答
1

C 2011 6.6 6:

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

C 2011 6.7.9 4:

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

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

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

于 2013-01-24T14:52:39.353 回答