GCC
在in 中使用复合文字进行静态结构初始化时,我遇到了一个奇怪的行为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
不能编译。
他们为什么要这样对我?