Каков размер пустой структуры в C?

Ускорение Дельфи , если Вы уже не находитесь на D2009

DDevExtensions, дает Вам несколько дополнительных тонких настроек в IDE

FastMM, Включенном в IDE от D2006 и но у Вас есть больше опций при выполнении его сами

, FastCode Высоко оптимизировал версии некоторого RTL и функций VCL

24
задан Community 23 May 2017 в 11:54
поделиться

3 ответа

Структура не может быть пустой в C, потому что это запрещено синтаксисом. Более того, существует семантическое ограничение, которое делает поведение неопределенным, если структура не имеет именованного члена:

struct-or-union-specifier:
  struct-or-union identifieropt { struct-declaration-list }
  struct-or-union identifier

struct-or-union:
  struct
  union

struct-declaration-list:
  struct-declaration
  struct-declaration-list struct-declaration

struct-declaration:
  specifier-qualifier-list struct-declarator-list ;

/* type-specifier or qualifier required here! */
specifier-qualifier-list:
  type-specifier specifier-qualifier-listopt
  type-qualifier specifier-qualifier-listopt

struct-declarator-list:
  struct-declarator
  struct-declarator-list , struct-declarator

struct-declarator:
  declarator
  declaratoropt : constant-expression

Если вы напишете

struct identifier { };

, вы получите диагностическое сообщение, потому что вы нарушаете синтаксические правила. Если вы напишете

struct identifier { int : 0; };

, то у вас будет непустая структура без именованных членов, что делает поведение неопределенным и не требует диагностики:

Если список-декларации-структуры не содержит именованных элементов, поведение не определено.

Обратите внимание, что следующее запрещено, поскольку элемент гибкого массива не может быть первым членом:

struct identifier { type ident[]; };
41
ответ дан 28 November 2019 в 23:04
поделиться

В C99: «Если список-декларации-структуры не содержит именованных членов, поведение не определено».

Синтаксис все равно не позволяет этого, хотя я не увидеть все, что говорит о необходимости диагностики, что возвращает его в лагерь «неопределенного поведения».

5
ответ дан 28 November 2019 в 23:04
поделиться

Грамматика C не допускает, чтобы содержимое struct было пустым - должно быть по крайней мере безымянное битовое поле или именованный член (насколько это касается грамматики - я не уверен, что структура, содержащая только безымянное битовое поле, в противном случае действительна).

Поддержка пустых структур в C является расширением в GCC .

В C ++ и пустая структура / спецификация члена класса явно разрешена, но размер определен равным 1 - если только в рамках оптимизации пустой базовой базы компилятору не разрешено заставлять пустой базовый класс не занимать места в производном классе.

6
ответ дан 28 November 2019 в 23:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: