У вас не может быть двух типов тегов (типы тегов - это структуры, объединения или перечисления) с разными тегами (которые следуют после ключевого слова struct / union / enum) указывают на один и тот же тип (вы можете думать о struct x
как указатель времени компиляции, указывающий на определение типа).Другими словами, struct x
никогда не может иметь псевдоним struct y
.Но вы можете иметь разные typedefs
, указывающие на один и тот же тип.
typedef struct flags_type1 {
uint8_t flag1;
uint8_t flag2;
} flags_type1; //flags_type1 is now both a tag and a global typename
typedef flags_type1 flags_type2; //flags_type2 == flags_type1
Возможно, вы захотите, чтобы flags_type1
и flags_type2
имели разные типы (ради функций), в которыхcase в чистом C вы можете сделать:
struct flags2 { struct flags1 embedded; }
После этого вам нужно будет указать имя участника (встроено), чтобы получить доступ к членам.Это неизбежно в прямой C (если вы не хотите использовать макрос для набора элементов), хотя в gcc / clang с -fms-extensions
вы можете сделать:
struct flags2 { struct flags1; }
//w/ -fms-extensions, reuseses the body and
//makes struct flags2 implicitly convertible to struct flags1
и затем получить доступ к членамнапрямую.
Кроме этого, всегда есть макросы.