Может ли int (*)[]
быть неполным типом?
C 2018 6.2.5 1 говорит:
В различных точках в единице перевода тип объекта может быть неполное (недостаточно информации для определения размера объектов этого типа) или полное (достаточно информации).
Таким образом, представляется, что если размер типа известен, тип завершен. 6.2.6.1 28 указывает, что определенные типы указателей должны иметь одинаковые размеры (указатели на void
и символы, указатели на совместимые типы, указатели на структуры и указатели на объединения), но указатели на другие типы могут различаться.
В реализации C, где все указатели или все указатели на массивы int
имеют одинаковый размер, тогда известен размер int (*)[]
, поэтому он будет завершен. В реализации, которая, скажем, использует разные указатели для больших массивов, размер не будет известен, поэтому он неполон.
Как указывает MM , структура не должна содержать члена с неполным типом, за исключением последнего элемента гибкого массива, согласно ограничению в 6.7.2.1. 3. Это предполагает, что реализация с указателями одного размера должна принимать struct { int (*p)[]; }
, тогда как реализация, имеющая разные размеры для таких массивов, должна диагностировать нарушение ограничения , (Это, в свою очередь, означает, что такая декларация не является частью строго соответствующего C.)