Если пользователь не обращается к элементам структуры напрямую,
только через функции-методы, то предоставлять поля структуры в
хедере не обязательно. Только имя для связывания. Это позволяет
спрятать все артефакты внешней либы от пользователя и
соответственно не инклудить её хедеры. Без всяких приведений типа. mylib.h
struct MyType;
int work (struct MyType * my_type);
mylib.c
#include "extlib.h"
struct MyType
{
struct ExtType ext_type;
};
int work (struct MyType * my_type)
{
ext_func(my_type->ext_type);
}
Нужно лишь создать все необходимые методы - фабрику типа, инициализацию и пр.