Компилятор IAR Embedded C доволен этим, и я предположил, что это правильный код C:
struct incomplete;
typedef struct incomplete (*why_not)[2];
struct incomplete {struct incomplete *known_to_work;} array[2];
why_not ok = &array;
Однако gcc и clang задыхаются от определения why_not
:
incomplete.c:2:29: error: array type has incomplete element type ‘struct incomplete’
typedef struct incomplete (*why_not)[2];
^
Технически нет причин отвергать определение типа «указатель на неполный массив». Ведь определение структуры нужно только там, где происходит разыменование такой переменной или выполняются какие-то арифметические операции с указателями.
Я стремлюсь скрыть определения структуры, где это возможно.
Что об этом говорит стандарт C?
struct S; void f(struct S s[]);
, хотяvoid f(struct S *s);
правильно, и было бы эквивалентно, если бы S был полным - person M.M   schedule 19.05.2017