0
typedef union { unsigned x; } T;

T a;
a.x = 3;

int main() { return 0; }

尝试编译此代码,gcc t.c我得到

error: expected '=', ',', ';', 'asm' or '__attribute__' before '.' token

使用

gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

当我搬进a.x = 3;去时main,它的行为符合预期。

我希望找到从

ISO/IEC 9899:TC3

其中解释了禁止将值分配给全局命名空间中的联合。


编辑:与结构它发生相同。

4

2 回答 2

2

我希望找到来自 ISO/IEC 9899:TC3 的段落,其中解释了禁止将值分配给全局命名空间中的联合。

它在 C99 的 6.9p1(翻译单元的语法)中进行了描述。您不能在函数之外有语句。

于 2013-02-07T20:46:02.497 回答
0

在语言规范中,你不能做的通常是隐含的而不是明确的,因为你不能做的事情是无限的。而且,事实上,您可以将值分配给全局命名空间中的联合,除非您要坚持“分配”不能引用初始化。用于初始化全局联合成员的 C99 语法如下所示:

typedef union { unsigned x; } T;

T a = {.x = 3};

当然,结构的答案相同。

于 2013-02-07T22:19:58.887 回答