C代码中的C4201警告

use*_*812 4 c c++

这个警告会在运行时产生任何问题吗?

ext.h(180):警告C4201:使用非标准扩展名:无名结构/联合

dre*_*lax 9

这是当你有一个没有名称的联合或结构时,例如:

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的成员一样.当您给联盟一个名称(这是标准要求的名称)时,您必须访问ab通过联合的名称:

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明确允许这种行为.

  • 这实际上在C11中有效. (2认同)