C: общий термин для структуры, объединения и перечисления?

В стандарте языка 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

зачем вам это?

gsamaras 04.12.2018 13:29

Хотя struct и union в чем-то похожи, enum - это нет.

Some programmer dude 04.12.2018 13:30

Может быть, вы ищете типы скаляр vs нескалярный?

500 - Internal Server Error 04.12.2018 13:31

@gsamaras Я определяю макрос, который должен работать ??? (также известные как структуры, объединения или перечисления).

sergej 04.12.2018 13:31

@ 500-InternalServerError - это не примеры массивов и векторов нескалярных типов?

gsamaras 04.12.2018 13:33

@gsamaras: Да, действительно - это не идеально.

500 - Internal Server Error 04.12.2018 13:34

Насколько мне известно, стандарт C не определяет такой общий термин. По какому признаку вы хотите считать их равными, а другие типы - не равными?

user694733 04.12.2018 13:36

@sergej - Не могли бы вы добавить к своему вопросу предполагаемый вариант использования?

StoryTeller - Unslander Monica 04.12.2018 13:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
8
325
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я видел, как для этих трех используется термин «типы тегов». Обоснование состоит в том, что эти три категории типов идентифицируются ключевым словом и тег из пространства имен тегов. В стандарте 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 04.12.2018 13:40

@gsamaras - Ну, в зависимости. Теги - это нормативный термин. Но я не из тех, кто должен судить, стоит ли это кому-нибудь знать. Итак, ИДК.

StoryTeller - Unslander Monica 04.12.2018 13:43

О "типах тегов" тоже не слышал. Это 3 разных типа, но они используют одни и те же правила для совместимого типа, который зависит от тега и описан в C17 6.2.7.

Lundin 04.12.2018 14:35

@Lundin - Мое (несовершенное) воспоминание из онлайн-форумов. Не слишком часто (потому что, правда, как часто нужно объединять эти три группы?), Но хотя бы один или два раза. Это не соответствует форме «формального термина» (поскольку его нет), но это не мое собственное изобретение (я не настолько умен).

StoryTeller - Unslander Monica 04.12.2018 14:46

Что касается вашего практического использования, я согласен с ответом StoryTeller. Этот ответ объясняет, что в стандарте нет такого определения.

Нет, не официально. Типы обсуждаются в 6.2.5. Он предоставляет метки для некоторых групп типов, но ни одна из них не охватывает именно объединения, структуры и перечисления.

  1. 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 keywords struct, union, or enum)

Они используют одни и те же правила для совместимого типа, 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 04.12.2018 15:45

@sergej Ага. Но упаковывать перечисления не имеет смысла. Это просто прославленные целые числа.

Lundin 04.12.2018 15:46

Я согласен, однако «Указание флага -fshort-enums в строке эквивалентно указанию атрибута packed во всех определениях enum».

sergej 04.12.2018 15:49

Другие вопросы по теме