В стандарте языка C или в литературе есть общий термин для структур, объединений и перечислимых типов?
Обновлять: Этот вопрос возник при работе над следующими макросами:
/* GCC */
#if defined(__GNUC__)
# define TYPEDEF_PACKED_BEGIN(type, tag) \
typedef type __attribute__((packed, aligned(1))) tag
# define TYPEDEF_PACKED_END
/* Green Hills */
#elif defined(__ghs__)
# define TYPEDEF_PACKED_BEGIN(type, tag) \
#pragma pack(1) \
typedef type tag
# define TYPEDEF_PACKED_END \
#pragma pack()
#endif
TYPEDEF_PACKED_BEGIN(struct, my_struct_tag) {
int a;
int b;
} my_struct_type;
TYPEDEF_PACKED_END
TYPEDEF_PACKED_BEGIN(enum, my_enum_tag) {
E_FOO,
E_BAR
} my_enum_type;
TYPEDEF_PACKED_END
Хотя struct и union в чем-то похожи, enum - это нет.
Может быть, вы ищете типы скаляр vs нескалярный?
@gsamaras Я определяю макрос, который должен работать ??? (также известные как структуры, объединения или перечисления).
@ 500-InternalServerError - это не примеры массивов и векторов нескалярных типов?
@gsamaras: Да, действительно - это не идеально.
Насколько мне известно, стандарт C не определяет такой общий термин. По какому признаку вы хотите считать их равными, а другие типы - не равными?
@sergej - Не могли бы вы добавить к своему вопросу предполагаемый вариант использования?





Я видел, как для этих трех используется термин «типы тегов». Обоснование состоит в том, что эти три категории типов идентифицируются ключевым словом и тег из пространства имен тегов. В стандарте C эти теги упоминаются в нескольких местах, в частности:
6.2.3 Name spaces of identifiers
[...] Thus, there are separate name spaces for various categories of identifiers, as follows:
- the tags of structures, unions, and enumerations (disambiguated by following any of the keywords struct, union, or enum);
Никогда об этом не слышал, спасибо! Однако он почти не используется (если вообще используется), и если я прочту это в документации или комментариях к макросу, мне намекают или сбивают с толку? Никто не знает - это все равно что вызывать UB при использовании этой фразы в комментариях! : O
@gsamaras - Ну, в зависимости. Теги - это нормативный термин. Но я не из тех, кто должен судить, стоит ли это кому-нибудь знать. Итак, ИДК.
О "типах тегов" тоже не слышал. Это 3 разных типа, но они используют одни и те же правила для совместимого типа, который зависит от тега и описан в C17 6.2.7.
@Lundin - Мое (несовершенное) воспоминание из онлайн-форумов. Не слишком часто (потому что, правда, как часто нужно объединять эти три группы?), Но хотя бы один или два раза. Это не соответствует форме «формального термина» (поскольку его нет), но это не мое собственное изобретение (я не настолько умен).
Что касается вашего практического использования, я согласен с ответом StoryTeller. Этот ответ объясняет, что в стандарте нет такого определения.
Нет, не официально. Типы обсуждаются в 6.2.5. Он предоставляет метки для некоторых групп типов, но ни одна из них не охватывает именно объединения, структуры и перечисления.
- The type char ,the signed and unsigned integer types, and the enumerated types are collectively called integer types . The integer and real floating types are collectively called real types
20. Any number of derived types can be constructed from the object, function, and incomplete types, as follows: [...] -A structure [...] -A union type [...]
Система типа C сложна и наполнена различными группами терминов.
Формально не существует категории типов, содержащей эти 3 типа. Что касается системы формальных типов (6.2.5), то у них мало общего.
struct и union - это производные типы. Это означает, что у вас может быть struct или union, содержащий другие объекты.struct - это агрегатный тип (как и массив), но union - это отдельный тип. И enum как скалярный тип - он не содержит экземпляров других объектов.Однако у этих трех разных типов есть некоторые общие черты:
У них есть теги, которые используют то же пространство имен C (как указано в ответе @StoryTeller):
6.2.3 Name spaces of identifiers
/--/
Thus, there are separate name spaces for various categories of identifiers, as follows:
/--/
- the tags of structures, unions, and enumerations (disambiguated by following any of the keywordsstruct,union, orenum)
Они используют одни и те же правила для совместимого типа, 6.2.7:
Moreover, two structure, union, or enumerated types declared in separate translation units are compatible if their tags and members satisfy the following requirements: ...
Таким образом, хотя они не одного типа, они используют ту же систему тегов и то же пространство имен, что и для тегов. Ваш конкретный компилятор использует это преимущество, позволяя им использовать один и тот же макрос для упаковки (удаления отступов). Это имеет смысл для struct и union, которые могут иметь байты заполнения, но не так много для enum, где концепция заполнения не имеет никакого смысла.
Из GCC документы «packed Этот атрибут, прикрепленный к определению типа enum, struct или union, указывает, что минимально необходимая память должна использоваться для представления типа».
@sergej Ага. Но упаковывать перечисления не имеет смысла. Это просто прославленные целые числа.
Я согласен, однако «Указание флага -fshort-enums в строке эквивалентно указанию атрибута packed во всех определениях enum».
зачем вам это?