2016-08-04 2 views
0

Является ли следующий код легальным C?Внедрение именованной структуры как анонимной структуры в другую структуру

#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 Хорошо, давайте проигнорируем этот аспект на данный момент :). В основном я имел в виду способ использования BASE_STRUCT. – TripShock

+1

@dxiv только с struct {}, а не если структура объявлена ​​в другом месте и называется именем, как в этом примере. http://stackoverflow.com/questions/23527255/is-this-a-c11-anonymous-struct – arsv

ответ

Смежные вопросы