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
解释说,禁止在全局命名空间中为联合赋值。
编辑:结构也是如此。
答案 0 :(得分:2)
我希望找到ISO / IEC 9899:TC3的段落,其中解释了禁止在全局命名空间中为联合赋值。
在C99的6.9p1中描述(翻译单元的语法)。你不能在函数之外发表声明。
答案 1 :(得分:0)
你不能做的事情通常是隐含的而不是语言规范中的明确,因为你无法做很多事情。事实上,除非你想坚持“assign”不能引用初始化,否则你可以为全局命名空间中的union赋值。用于初始化全局联合成员的C99语法如下:
typedef union { unsigned x; } T;
T a = {.x = 3};
当然,结构的答案相同。