2016-08-04 22 views
0

次のコードは合法的ですか?名前のある構造体を別の構造体に匿名構造体として埋め込む

#include <stdio.h> 

typedef struct _BASE_STRUCT 
{ 
    int BaseMember; 
} BASE_STRUCT, *PBASE_STRUCT; 

typedef struct _DERIVED_STRUCT 
{ 
    BASE_STRUCT; // Members belonging to this struct are "embedded" here. 
    int DerivedMember; 
} DERIVED_STRUCT, *PDERIVED_STRUCT; 

// 
// Above struct declaration is equivalent to the following, which I believe is valid 
// in C11 (anonymous structs). 
// 
// typedef struct _DERIVED_STRUCT 
// { 
//  struct 
//  { 
//   int BaseMember; 
//  }; 
//  int DerivedMember; 
// } DERIVED_STRUCT, *PDERIVED_STRUCT; 
// 

int main() 
{ 
    DERIVED_STRUCT ds; 
    ds.BaseMember = 10;  // Can be accessed without additional indirection. 
    ds.DerivedMember = 20; 

    printf("%d\n", ds.BaseMember); 

    return 0; 
} 

Visual Studioでは、匿名の構造体に関する警告を除いて、不平を言うことはないようです。しかし、匿名の構造体を使用するコードに対しても同じ警告がありますので、まだC11準拠に更新されていないと仮定します。

+3

では先頭にアンダースコア記号は大文字を実装のために予約されているが続くので、それは(本当に法的ではありませんつまり、コンパイラがそのようなコードを受け入れないだろうし、標準ライブラリ)。 –

+1

@JoachimPileborg OK、その時点では無視しましょう:)。私は主に 'BASE_STRUCT'が使われる方法を指していました。 – TripShock

+1

@dxivは構造体{}のみで、構造体が他の場所で宣言されていて、この例のように名前で参照されていない場合は無効です。 http://stackoverflow.com/questions/23527255/is-this-a-c11-anonymous-struct – arsv

答えて