170 похожих чатов

Всем привет. У меня простой вопрос, до ответа на которой

я не дошёл сам.
Подскажите как идейно в плюсах принято дистрибютить заголовочные файлы?

Например, есть у меня следующая структура
- include
libfoo.hpp
- src
libfoo\
libfoo.cpp
main.cpp

В libfoo.hpp у меня декларация класса, реализация которой в libfoo.cpp. Но, что я пока не совсем понимаю - в libfoo.hpp у меня есть приватная секция (поля, методы), которая не является API. Как мне дистрибьютить libfoo.hpp + собранную libfoo.so не шаря с народом внутреннюю реализацию?

Вопрос наверное идиотский :) Сори если вопрос совсем глупый. Можно в плюсах иметь у класса 2 хедера - один, который нужен только при сборке и там внутренняя кухня, второй - публичный интерфейс?

17 ответов

11 просмотров

Как угодно. Просто текстовые файлы, желательно в одном подкаталоге. Но никаких правил жёстких нет.

Про приватные секции -- либо ты их выдаёшь наружу как есть, либо -- перемещаешь в отдельный заголовочный файл, который НЕ выдаёшь и используешь только в исходном модуле с реализацией.

Можно в плюсах иметь у класса 2 хедера - один, который нужен только при сборке и там внутренняя кухня, второй - публичный интерфейс? -- можно, хоть ДЕСЯТЬ заголовков. Но больше десяти -- НЕЛЬЗЯ ( :

Можно pimpl использовать, если прям хочется скрыть внутреннюю реализацию. Или иметь два набора апи, публичный, который выставляешь наружу и внутренний, на котором уже работает реализация библиотеки. Они даже могут общаться друг с другом через какую-то прослойку, например на си. Так сделано в ex-intel mkl dnn, например, да и во многих других библиотеках.

Pavel Samolysov
Можно pimpl использовать, если прям хочется скрыть...

До PIMPL пока ещё не дошли, пока нет в нём нужды очевидной.

Serghei-Iakovlev Автор вопроса
Ilya Zviagin
Про приватные секции -- либо ты их выдаёшь наружу ...

Очень хорошо, а можно ссылку на почитать как второе делается? Или ссылку на любой проект где такое применяется? Чтобы я тут не флудил детскими вопросами. Я же правильно понимаю у 1 класса может быть 2 хедера - в одном хедере его публичная часть, в втором - приватная? Или я не правильно понял?

Serghei Iakovlev
Очень хорошо, а можно ссылку на почитать как второ...

Нет никакой ссылки, просто сделай два файла из одного, разделив куски.

можно паттерн мост заюзать

Serghei-Iakovlev Автор вопроса
Ilya Zviagin
Нет никакой ссылки, просто сделай два файла из одн...

Если всё так просто, то это просто волшебно (: Спасибо

дистрибьютить libfoo.so - плохое решение, если только это не что-то проприетарное

Serghei-Iakovlev Автор вопроса
Alexander Karaev
дистрибьютить libfoo.so - плохое решение, если тол...

пакетные менеджеры так делают же libfoo.deb, devlibfoo.deb

std::slavik
.a?

дистрибьютят сорцы, а из них уже собирают target_add_library(hello-world PRIVATE foo-lib)

Serghei Iakovlev
пакетные менеджеры так делают же libfoo.deb, devli...

пакетные менеджеры завязаны на дистрибутив, конкретную ось и тулчейн, если задача сделать нормальную кроссплатформенную либу, то cmake и сорцов достаточно

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта