Существует ли неполный тип без массива?


Все, что я нашел в стандарте C11 для неполных типов, - это неполные типы массивов.

Мне было интересно, существует ли неполный тип без массива.

4 3

4 ответа:

Для справки, что такое неполный, полный ?

В различных точках внутри единицы перевода тип объекта может быть неполный (Отсутствие достаточной информации для определения размера объектов этого типа) илиполный (наличие достаточной информации). C11 §6.2.5 1


В дополнение к потенциально struct, union, массивы и всегда void, enum являются временно неполными в том, что их размер неполон пока }

... Перечисляемый тип является неполным до тех пор, пока сразу после }, который завершает список объявлений перечислителя, и завершается после этого. C11 §6.7.2.2 4

int main() {
  enum ee1 { a1 = 0, b1 = sizeof(int), c1 };
  printf("%zu\n", sizeof(enum ee1));  // OK

  // error: invalid application of 'sizeof' to incomplete type 'enum ee2'
  //                                        v--------------v 
  enum ee2 { a2 = 0, b2 = sizeof(int), c2 = sizeof(enum ee2) }; // Bad
  printf("%zu\n", sizeof(enum ee2)); // OK
}

Далее

Все объявления структуры, объединения или перечисляемых типов, которые имеют одинаковую область видимости и используют один и тот же тег, объявляют один и тот же тип. Независимо от того, есть ли тег или какие другие объявления типа находятся в той же самой единице перевода, тип является неполным до тех пор, пока сразу же после закрывающей скобки списка, определяющего содержание, и завершается после этого . §6.7.2.3 4

Неполный тип-это тип, который описывает идентификатор, но не содержит информации, необходимой для определения размера идентификатора. "Неполный тип" может быть

  • Тип структуры, члены которого вы еще не указали.

  • Тип объединения, члены которого вы еще не указали.

  • Тип массива, размерность которого вы еще не указали.

Тип void является неполным типом, который не может быть завершен

Прямое объявление struct или union без последнего определения его содержания также является неполным типом.

Из раздела 6.2.5 стандарта C :

22 тип массива неизвестного размера является неполным типом. Он завершается для идентификатора этого типа указанием размера в поле более позднее объявление (с внутренней или внешней связью). структура или тип объединения неизвестного содержания (как описано в разделе 6.7.2.3) является незавершенный тип. Он завершен для всех объявлений этого типа, объявляя ту же структуру или тег объединения с его определяющим содержимым позже в том же объеме.

Да, void также является неполным типом, который никогда не может быть полным.

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

Добавить, цитируя C11, Главу §6.2.5/P1

[...] В различных точках в пределах единицы перевода тип объекта может быть неполный (отсутствие достаточной информации для определения размера объектов этого типа) или полный (обладающий достаточной информацией).

P19,

Тип void содержит пустой набор значений; это неполный тип объекта, который не может быть завершено.

И, P22,

Тип массива неизвестного размера является неполным типом. Он завершается для идентификатора этого типа путем указания размера в более позднем объявлении (с внутренняя или внешняя связь). Структура или тип объединения неизвестного содержания (как описано в пункте 6.7.2.3) является неполным типом. Он завершается для всех объявлений этого типа объявлением одной и той же структуры или тега объединения с его определяющим содержимым позже в той же области.