Каков размер пустой структуры в C? - PullRequest
24 голосов
/ 26 октября 2009

По-моему, это ноль, но, кажется, здесь немного путаницы здесь

Я проверил его с помощью компилятора gcc, и он выдает мне ноль в качестве вывода. Я знаю, что в C ++ размер пустого класса равен 1. Дайте мне знать, если я что-то здесь упускаю.

Ответы [ 4 ]

41 голосов
/ 26 октября 2009

Структура не может быть пустой в 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[]; };
6 голосов
/ 26 октября 2009

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

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

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

5 голосов
/ 26 октября 2009

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

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

1 голос
/ 04 июня 2013

в VC 8 Выдает ошибку, если мы пытаемся получить размер пустой структуры, наоборот, в linux с gcc он дает размер 1, потому что он использует расширение gcc вместо спецификации языка c, которая говорит, что это неопределенное поведение.

struct node
{
// empty struct.
};

int main()
{
printf("%d", sizeof(struct node));
return 0;
}

на windows vc 2005 выдает ошибку компиляции на Linux с GCC это дает размер 1, потому что расширение GCC http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Empty-Structures.html#Empty-Structures (Указано Майклом Берром)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...