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;

構造体のメンバーであるかのように、ユニオンのメンバーにアクセスできます。ユニオンに名前(標準で要求されている名前)を付ける場合は、代わりにユニオンの名前にアクセス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はこの動作を明示的に許可します。

于 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 に答える