Undeclared struct не вызывает никаких предупреждений
Следующий код компилируется без каких-либо предупреждений о gcc.
Обратите внимание, что нет прямого объявления для структуры. Является ли это допустимым кодом C и/или С++?
struct Foobar* f;
struct Foobar* fun() { return 0; }
int main() { f = 0; fun(); return 0; }
Ответы
Ответ 1
Это называется непрозрачной структурой и не является ошибкой. Поскольку все указатели на структуры одинаково велики в C, нет необходимости знать, какие поля у структуры есть, пока вы просто манипулируете указателями на нее.
Попробуйте определить переменную struct Foobar (без указателя), и вы получите ошибку неполного типа.
Это позволяет вам иметь типы с частными полями, например. тип FILE из stdio.h.
Ответ 2
Действителен в C.
struct Foobar* f;
совпадает с:
struct Foobar;
struct Foobar* f;
В C он объявляет неполный тип struct Foobar
и объявляет объект-указатель неполным типом.
Тип может быть завершен в другой единицы перевода. (В C есть 3 типа типа: объект, функция и неполное).
Вы не можете создавать объекты неполного типа или получать размер этого типа:
struct Foobar x; // not valid
sizeof (struct Foobar); // not valid
но вы можете создать указатели на неполные типы (struct Foobar* g;
) или typedef
(typedef struct Foobar Foobar;
).