6

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

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

4

5 回答 5

12

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

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;

它允许您访问联合的成员,就好像他们是结构的成员一样。当您给联合命名时(这是标准所要求的),您必须访问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;

只要您使用共享此扩展的编译器编译代码,这不是问题,仅当您使用不共享此扩展的编译器编译代码时才会出现问题并且由于标准不需要这种行为,因此编译器是自由拒绝此代码。

编辑:正如 andyn 所指出的,C11 明确允许这种行为。

于 2013-01-23T06:09:13.530 回答
1

嗯,这是一个 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,然后简单地忽略警告。

于 2013-01-23T06:06:02.903 回答
0

不,它不会产生任何问题,它只是意味着您的代码不符合标准,这意味着它可能无法与其他一些编译器一起编译。

于 2013-01-23T06:06:39.743 回答
0

只要它受编译器支持,它应该可以正常工作,直到您决定移植到新平台(或使用新编译器),或者他们撤回支持。

于 2013-01-23T06:06:43.617 回答
0

你可能和他有同样的问题

只需为您的结构/联合命名

例如

struct mystruct {
   ...
} 
于 2013-01-23T06:07:06.063 回答