此警告会在运行时产生任何问题吗?
ext.h(180):警告 C4201:使用了非标准扩展:无名结构/联合
这是当您有一个没有名称的联合或结构时,例如:
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;
它允许您访问联合的成员,就好像他们是结构的成员一样。当您给联合命名时(这是标准所要求的),您必须访问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;
只要您使用共享此扩展的编译器编译代码,这不是问题,仅当您使用不共享此扩展的编译器编译代码时才会出现问题,并且由于标准不需要这种行为,因此编译器是自由拒绝此代码。
编辑:正如 andyn 所指出的,C11 明确允许这种行为。
嗯,这是一个 MSVC 警告,它告诉您您正在使用编译器特定的语言扩展。所以你可以检查一下。
使用的非标准扩展:无名结构/联合
在 Microsoft 扩展 (/Ze) 下,您可以将不带声明符的结构指定为另一个结构或联合的成员。这些结构在 ANSI 兼容性 (/Za) 下会产生错误。
// C4201.cpp
// compile with: /W4
struct S
{
float y;
struct
{
int a, b, c; // C4201
};
} *p_s;
int main()
{
}
如果您不关心代码的可移植性。即:您的目标平台只是 MSVC,然后简单地忽略警告。
不,它不会产生任何问题,它只是意味着您的代码不符合标准,这意味着它可能无法与其他一些编译器一起编译。
只要它受编译器支持,它应该可以正常工作,直到您决定移植到新平台(或使用新编译器),或者他们撤回支持。