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;).