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

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

lib_public.h:

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

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


person St.Antario    schedule 05.04.2019    source источник
comment
Если у вас непрозрачная структура, а фактическую структуру нужно использовать в нескольких исходных файлах в библиотеке, то это лучшее, простое и естественное решение. Чтобы немного упростить это, вам не нужно включать как общедоступный, так и частный заголовочный файл, включите только частный заголовочный файл, а частный заголовочный файл будет включать общедоступный.   -  person Some programmer dude    schedule 05.04.2019
comment
@Someprogrammerdude Итак, если у меня есть более одного частного заголовка, я включаю общедоступный во все из них и использую частный в реализации везде, где это необходимо.   -  person St.Antario    schedule 05.04.2019
comment
Как-то так да.   -  person Some programmer dude    schedule 05.04.2019


Ответы (1)


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

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

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

person Angew is no longer proud of SO    schedule 05.04.2019