У меня есть странная проблема с gcc 4.3, и я хотел знать, является ли это конкретной проблемой с компилятором или это общая проблема C. Конечно, я использую очень странную конструкцию, но она мне нравится, потому что она позволяет мне применять некоторые правила, которые в противном случае были бы невозможны. Проект разделен на несколько модулей, и каждый модуль имеет непрозрачную структуру. В заголовке есть объявление typedef struct <tag> <type>
, а в 1 файле c есть struct tag { ... };
, и все функции ссылаются на элемент через <type> *
.
Каждый модуль знает свою структуру, структуры других модулей не видны. В одном модуле я работаю не с 1 элементом, а с фиксированным массивом элементов. Это означает, что некоторые функции этого модуля работают с указателем на массив. Назовем этот модуль wdi
. Так у меня например
void write_all(wdi_type (*wdis)[MAX_WDI]);
а для размещения (знаю очень необычный синтаксис) возвращать прямо правильный указатель на массив.
wdi_type (*wdi_alloc(void))[MAX_WDI];
Это хорошо работает под GNU-C 3.4.6 (Solaris SPARC), под cc, компилятором sun v12, который он также компилирует (не удалось проверить, потому что другая часть приложения ломается). Однако на gcc 4.3.3 (также тестировалось на 4.4.6 x86-64 и 4.6.2 ARM) это не так. Я получаю ошибку компиляции array type has incomplete element type
. Я не понимаю, зачем компилятору нужна эта информация на этом этапе. Ему также не нужен размер других непрозрачных структур.
Это ошибка gcc?
Что говорит стандарт?
Я не смог найти что-то об этом. Должен ли я подать отчет об ошибке в GNU?