Помещение непрозрачного определения структуры в отдельный заголовочный файл - PullRequest
2 голосов
/ 05 апреля 2019

Я проектирую библиотеку с открытым интерфейсом, содержащим объявление непрозрачной структуры:

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

Это общий подход? Если нет, то как можно было бы спроектировать его лучше?

1 Ответ

4 голосов
/ 05 апреля 2019

Да, это прекрасно.

Дело в том, что такой дизайн кажется грязным в том смысле, что структура определена в одном частном заголовочном файле (lib_struct_linux.h), функции для работы со структурой объявлены в другом общедоступном заголовочном файле (lib_public.h). И определение функций в еще одном файле реализации (lib_struct.c).

Позвольте мне перефразировать это: «Открытый интерфейс находится в открытом заголовке, объявления только для реализации находятся в частном заголовке, а реализация находится в исходном файле». На самом деле это не звучит беспорядочно, для меня это звучит как очень хороший дизайн.

...