2016-08-04 15 views
0

Ist der folgende Code zulässig C?Embedding einer benannten Struktur als anonyme Struktur in einer anderen Struktur

#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 scheint sich nicht darüber zu beschweren, außer für die Warnung über anonyme Strukturen. Es hat jedoch die gleiche Warnung für Code, der anonyme Strukturen verwendet, also nehme ich an, dass es nur noch nicht aktualisiert wurde, um C11-konform zu sein.

+3

Nein, es nicht wirklich legal ist, weil Symbole mit einem führenden von einem Großbuchstaben gefolgt Strich für die Implementierung reserviert ist (dh Compiler und Standardbibliothek). –

+1

@JoachimPileborg OK, lass uns diesen Aspekt jetzt ignorieren :). Ich habe mich hauptsächlich auf die Art und Weise bezogen, wie 'BASE_STRUCT' verwendet wird. – TripShock

+1

@dxiv nur mit Struktur {}, nicht wenn die Struktur an anderer Stelle deklariert ist und wie in diesem Beispiel durch den Namen bezeichnet wird. http://stackoverflow.com/questions/23527255/is-this-a-c11-anonymous-struct – arsv

Antwort