将值赋给union结构的字段的意外行为

时间:2013-02-07 20:37:52

标签: c

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

解释说,禁止在全局命名空间中为联合赋值。


编辑:结构也是如此。

2 个答案:

答案 0 :(得分:2)

  

我希望找到ISO / IEC 9899:TC3的段落,其中解释了禁止在全局命名空间中为联合赋值。

在C99的6.9p1中描述(翻译单元的语法)。你不能在函数之外发表声明。

答案 1 :(得分:0)

不能做的事情通常是隐含的而不是语言规范中的明确,因为你无法做很多事情。事实上,除非你想坚持“assign”不能引用初始化,否则你可以为全局命名空间中的union赋值。用于初始化全局联合成员的C99语法如下:

typedef union { unsigned x; } T;

T a = {.x = 3};

当然,结构的答案相同。