Може int (*)[]
бути неповним типом?
C 2018 6.2.5 1 каже:
У різних точках в одиниці перекладу тип об'єкта може бути неповним (бракує достатньої інформації для визначення розміру об'єктів цього типу) або повним (має достатню інформацію).
Таким чином, здається, що якщо розмір типу відомий, тип буде повним. 6.2.6.1 28 вказується, що певні типи покажчиків повинні мати однакові розміри (покажчики на void
символи, покажчики на сумісні типи, вказівники на структури та вказівники на союзи), але вказівники на інші типи можуть відрізнятися.
У застосуванні C, де всі вказівники або всі вказівники на масиви int
мають однаковий розмір, тоді розмір int (*)[]
відомий, тому він був би повним. У реалізації, яке, скажімо, використовує різні покажчики для великих масивів, розмір не буде відомий, тому він є неповним.
Як зазначає ММ , структура не повинна містити члена з неповним типом, за винятком остаточного гнучкого члена масиву, за обмеженням в 6.7.2.1 3. Це говорить про те, що реалізація з одним розміром покажчиків повинна приймати, struct { int (*p)[]; }
тоді як реалізація має інший розміри для таких масивів повинні діагностувати порушення обмеження. (Це в свою чергу означає, що така декларація не є частиною суворої відповідності С.)
void *
свідчить про те, що вказівник на неповний тип може бути повним. Це не показує, чи може вказівник на неповний тип бути неповним. Якщо хтось запитав: «Чи може ссавець бути слоном?», Показуючи, що «Лев - ссавець», це не означає, що ссавець не може бути слоном. Питання задає питання, чи може множина X покажчиків на неповний тип містити неповний елемент. Показати, що набір X покажчиків на неповний тип містить елемент, який є повним, не має значення.