Мне нравится называть приватные заголовочные файлы суффиксом '-internal'.Для вашего примера, я бы имел
foobar.c
#include "foobar-internal.h"
#include "foobar.h"
/* functions using `struct TS1` and `struct TS2` */
.
foobar.h
#ifndef H_FOOBAR_INCLUDED
#define H_FOOBAR_INCLUDED
struct TS1;
#endif
.
foobar-internal.h
#ifndef H_FOOBAR_INTERNAL_INCLUDED
#define H_FOOBAR_INTERNAL_INCLUDED
struct TS2 { int whatever; };
struct TS1 { int whatever; struct TS2 internal; };
#endif
Любой код, использующий ваши функции, включая более простые "foobar.h"
иможно использовать указатели на struct TS1
.Он не может напрямую использовать объекты типа struct TS1
или struct TS2
.Фактически, включив всего лишь "foobar.h"
, код не имеет представления о существовании типа struct TS2
в любом месте и может переопределить его для своих собственных целей.
usercode.c
#include "foobar.h"
struct TS1 *x;
x = newTS1();
work(x);
destroyTS1(x);