Я проектирую библиотеку с открытым интерфейсом, содержащим объявление непрозрачной структуры:
lib_public.h
* * 1004
typedef struct lib_struct lib_struct;
void foo(lib_struct *ptr);
void bar(lib_struct *ptr);
Непрозрачная структура lib_struct
скрывает детали реализации, зависящие от ОС, поэтому, кажется, плохой дизайн - вставлять ее в lib_struct.h
напрямую. Но я все еще хочу написать для него модульные тесты, в которых используются его члены. В настоящее время я решил создать отдельный частный заголовочный файл, содержащий только определение структуры:
lib_struct_linux.h
:
struct lib_struct{
int epoll;
int acceptor_socket;
}
Таким образом, реализация lib_struct.c
, а также модульное тестирование lib_struct_test.c
будут включать этот заголовок следующим образом:
lib_struct.c
:
#include "lib_struct_linux.h"
//function definition
lib_struct_test.c
#include "lib_struct_linux.h"
//unit tests
Дело в том, что такой дизайн кажется грязным в том смысле, что структура определена в одном частном заголовочном файле (lib_struct_linux.h
), функции для работы со структурой объявлены в другом общедоступном заголовочном файле (lib_public.h
). И определение функций в еще одном файле реализации (lib_struct.c
).
Это общий подход? Если нет, то как можно было бы спроектировать его лучше?