Это то, что известно как объявление непрозрачной структуры ! Вероятно, в этом заголовке есть функции и / или классы, которые используют указатели на тип asdf_t
- что разрешено в C ++ для неопределенных структур. Однако не будет (не может быть) объявленных переменных, членов класса или аргументов функции, которые являются экземплярами из asdf_t
.
Так, например, ваш заголовок может позже объявитьследующий класс:
class GoodBoy {
public: GoodBoy();
~GoodBoy();
private:
asdf_t* forMyEyesOnly; // Only a pointer - definition not needed!
}
Но он не может иметь это:
class BadGirl {
public BadGirl();
~BadGirl();
private:
asdf_t notForAnyOneToSee; // Won't compile - would need definition.
}
Почему это сделано?
Обычно это потому, что создатели используемой вами библиотеки не хотят, чтобы вы знали детали этой структуры! Однако они должны предоставить такое «минимальное» определение, чтобы вы могли использовать классы и так далее , чтобы - по необходимости - использовать или ссылаться на эту структуру: так, например, в Реализация класса GoodBoy
(т.е. частных исходных файлов, в которых для asdf_t
дано полное определение ), можно было бы сделать так, чтобы конструктор и деструктор выполняли что-то вроде, скажем:
GoodBoy::GoodBoy() {
forMyEyesOnly = new asdf_t; // Note: Neither the 'new' operation, nor...
}
GoodBoy::~GoodBoy() {
delete forMyEyesOnly; // ...the 'delete' can compile without FULL DEFINITION!
}
Уточнение
Обычно такая непрозрачная структура объявляется просто: struct asdf_t;
! Тем не менее, typedef struct asdf_t asdf_t;
и typedef struct asdf_t;
также являются допустимым синтаксисом (если немного странно).
Дальнейшее чтение
Есть хорошее (если немного старое) обсуждение переполнения стека на непрозрачных структурахи как их объявить, здесь .