【发布时间】:2015-10-30 01:23:27
【问题描述】:
在GCC 和c99/gnu99 模式下使用复合文字进行静态结构初始化时遇到了一个奇怪的行为。
显然这很好:
struct Test
{
int a;
};
static struct Test tt = {1}; /* 1 */
但是,这不是:
static struct Test tt = (struct Test) {1}; /* 2 */
这会触发以下错误:
初始化元素不是常量
这也无济于事:
static struct Test tt = (const struct Test) {1}; /* 3 */
我明白静态结构的初始化值应该是编译时常量。但我不明白为什么这个最简单的初始化表达式不再被认为是常量?这是由标准定义的吗?
我问的原因是我遇到了一些在 gnu90 模式下用 GCC 编写的遗留代码,这些代码使用这种复合文字构造进行静态结构初始化 (2)。显然,这在当时是一个 GNU 扩展,后来被 C99 采用。
现在导致用GNU90成功编译的代码既不能用C99也不能用GNU99编译。
他们为什么要这样对我?
【问题讨论】:
-
顺便说一句,that has been fixed in GCC 5(因为 Linux 内核正在使用这个扩展但它没有使用
-std=gnu89并且 GCC 5 将默认值更改为 gnu11)。 -
如果你想要一个 const 结构,请使用 static const struct Test tt = {1};
-
@cup - OP 提到了这一点,但这不是他们的问题。他们的问题是“为什么”,而不是“如何”。
-
@Mr.Llama 都是一样的:就解决问题而言,最好的办法是不使用冗余(充其量)文字,而只编写简单的代码。
-
@cup 应该是
static struct Test tt = { 1 };。原始代码显然是在定义非常量对象。
标签: c gcc struct compound-literals