【发布时间】:2014-05-29 20:12:35
【问题描述】:
我想不通。为什么会这样编译:
typedef struct A {
int foo[3];
} a_t;
typedef struct B {
char tag;
a_t foo;
} b_t;
const a_t default_a = { { 1, 2, 3 } };
int
main(int argc, char **argv)
{
const b_t default_b = { 'A', default_a };
return 0;
}
这不是:
typedef struct A {
int foo[3];
} a_t;
typedef struct B {
char tag;
a_t foo;
} b_t;
const a_t default_a = { { 1, 2, 3 } };
const b_t default_b = { 'A', default_a };
int
main(int argc, char **argv)
{
return 0;
}
> gcc tp.c
tp.c:13:1 error: initializer element is not constant
tp.c:31:1 error: (near initialization for ...default_b.foo...)
唯一的变化是 default_b 的声明范围。为什么这有什么不同?据我所知,它们要么都是有效的,要么都应该是错误的。但是 gcc (v4.7.3) 接受第一个而不是第二个。这让我发疯了。
[[edit]] 加分的后续问题:鉴于第二个程序不符合 C 标准,我该如何以符合标准的方式完成同样的事情? IE:default_b 的全局常量定义,包含 default_a 的值。
【问题讨论】:
标签: c struct initialization