Является ли следующий код легальным 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.
Нет, это не совсем законным, поскольку символы с подчеркиванием последующего прописной буквой зарезервирован для реализации (то есть компилятора и стандартная библиотека). –
@JoachimPileborg Хорошо, давайте проигнорируем этот аспект на данный момент :). В основном я имел в виду способ использования BASE_STRUCT. – TripShock
@dxiv только с struct {}, а не если структура объявлена в другом месте и называется именем, как в этом примере. http://stackoverflow.com/questions/23527255/is-this-a-c11-anonymous-struct – arsv