这是当你有一个没有名称的联合或结构时,例如:
typedef struct
{
union
{
int a;
int b;
}; // no name
int c;
} MyStruct;
MyStruct m;
m.a = 4;
m.b = 6; //overwrites m.a
m.c = 8;
Run Code Online (Sandbox Code Playgroud)
它允许您访问union的成员,就好像它们是struct的成员一样.当您给联盟一个名称(这是标准要求的名称)时,您必须访问a并b通过联合的名称:
typedef struct
{
union
{
int a;
int b;
} u;
int c;
}
MyStruct m;
m.u.a = 4;
m.u.b = 6; // overwrites m.u.a
m.c = 8;
Run Code Online (Sandbox Code Playgroud)
只要您使用共享此扩展的编译器编译代码就不是问题,只有在使用编译器编译代码时才会出现问题,并且因为标准不需要此行为,编译器是免费拒绝此代码.
编辑:正如andyn所指出的,C11明确允许这种行为.