Пустая структура в C - PullRequest
       14

Пустая структура в C

11 голосов
/ 16 апреля 2009

У меня есть структура без членов (на данный момент), и я хотел бы знать, возможно ли подавить полученное предупреждение:

warning: struct has no members

Можно ли добавить члена и оставить sizeof структуру ноль? Любое другое решение?

Ответы [ 7 ]

22 голосов
/ 16 апреля 2009

В c поведение пустой структуры зависит от компилятора по сравнению с c ++, где оно является частью спецификации ( объяснения здесь )

C ++
Класс с пустой последовательностью членов и объектов базового класса является пустым классом. Завершенные объекты и дочерние подобъекты пустого типа класса должны иметь ненулевой размер.

в C это довольно мутно, поскольку в стандарте c99 есть некоторый язык, который подразумевает, что действительно пустые структуры недопустимы (см. Ответ TrayMan), но многие компиляторы разрешают это (например, gcc ). 1012 *

Поскольку это зависит от компилятора, маловероятно, что в этом случае вы получите действительно переносимый код. Поэтому такие непереносимые способы подавления предупреждения могут быть лучшим выбором.

20 голосов
/ 26 мая 2011

если вам просто нужен символ struct для приведения типов и аргументов функций, просто:

typedef struct _Interface Interface;

это создаст символ для непрозрачного типа.

11 голосов
/ 14 марта 2013

Технически это даже не верно C.

TrayMan был немного не в своем анализе, да, 6.2.6.1 говорит:

За исключением битовых полей, объекты состоят из смежных последовательностей из одного или нескольких байтов, число, порядок и кодирование которых либо явно определены, либо определены реализацией.

но свяжите это с 6.2.5-20, которое гласит:

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

и теперь вы можете заключить, что структуры будут иметь один или несколько байтов , поскольку они не могут быть пустыми. Ваш код предупреждает вас, хотя тот же код на самом деле не сможет скомпилировать в Microsoft Visual Studio с ошибкой:

ошибка C2016: C требует, чтобы структура или объединение имели хотя бы одного члена

Таким образом, короткий ответ - нет, нет портативного способа избежать этого предупреждения, потому что он говорит вам, что вы нарушаете стандарты Си. Вам нужно будет использовать специфичное для компилятора расширение, чтобы подавить его.

5 голосов
/ 16 апреля 2009

Стандарт C99 несколько двусмысленен в этом, но, кажется, говорит, что пустая структура должна иметь ненулевой размер.

6.2.6.1 За исключением битовых полей, объекты состоят из смежных последовательностей из одного или нескольких байтов, номер, порядок и кодировка которых либо указаны явно, либо реализации.

2 голосов
/ 28 мая 2009

Можно ли добавить член и сохранить размер структуры равным нулю?

Нет. FWIW, C ++ допускает пустые структуры, но sizeof () всегда является ненулевым для пустой структуры.

Любое другое решение?

Не просто. Стоит отметить, что пустые структуры поддерживаются только в C и запрещены в C99.

Пустые структуры поддерживаются в C ++, но разные компиляторы реализуют их с разными результатами (для смещения sizeof и struct), особенно после того, как вы начнете добавлять наследование в смесь.

2 голосов
/ 16 апреля 2009

Если вы не требуете «слишком строгой» приверженности, вам может это сойти с рук:

struct empty {
  char nothing[0];
};

Это расширение GCC , хотя.

Я надеялся, что смогу использовать функцию C99 под названием «гибкие массивы», объявленную так:

struct empty99
{
  char nothing[]; // This is a C99 "flexible array".
};

но это не работает; они требуют, чтобы сначала был хотя бы один нормальный член структуры, они не могут быть единственным членом.

1 голос
/ 10 мая 2013
struct zero_information { int:0; };

Приведенный выше фрагмент кода даст значение , отличное от , от нуля от sizeof(struct zero_information), но оно может помочь вам получить то, что вы ищете, так как 100% всей памяти, выделенной для него, это заполнение (доступно только с помощью хаков, хотя я не помню, как из-за того, что присоединение к отступам является неопределенным поведением).

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