Я работаю над проектом, в котором желательно скрыть содержимое заголовочных файлов. Недавно я пришел к идее предварительно скомпилированных заголовков. Насколько применимы эти вещи?
По сути, я бы скрывал содержимое файлов заголовков от конечного пользователя фреймворка.
Цель файлов заголовков — описать интерфейс, который должен использовать пользователь. Зачем тебе это скрывать? Это именно та часть вашей программы, которая вам нужна для связи с пользователем фреймворка. Все, что не является частью интерфейса, можно вынести в отдельный исходный файл и раздавать только в скомпилированном виде.
Интерфейс, который они используют, не скрыт. Что скрыто, так это часть фреймворка, которая используется внутри
Похоже, вам нужно два файла заголовков, один для интерфейса и один для внутренних вещей. Не выдавайте внутреннюю.
Если в вашем заголовке происходит утечка информации о фреймворке, лучшим решением будут абстракции в вашем заголовке, а не хитрость, чтобы запутать его.
прыщ может быть лучшим подходом для достижения вашей цели. Я считаю, что предварительно скомпилированные заголовки не годятся для этой цели. Это, вероятно, помешает вашим клиентам использовать предварительно скомпилированные заголовки для собственного использования, будет хрупким, и вам придется поддерживать, сколько платформ с каким количеством компиляторов с сколькими различными настройками параметров компилятора? Если бы я увидел это в библиотеке/фреймворке, я бы просто сказал нет.
Это достаточно справедливо @AviBerger. До сих пор я использовал pimpl для всего проекта. Кажется, это самый оптимальный подход.
Если вы беспокоитесь о производительности, но знаете размеры своих реализаций, вы можете использовать класс pimpl, чтобы избежать динамических аллокаций.
Для тех, кто в будущем, предварительно скомпилированный заголовок не является ответом просто потому, что его вывод не зависит от платформы. Использование идиомы pimpl [или подобных понятий] должно быть очень предпочтительным.
Обратите внимание, что ваш вопрос и ответ относятся к конкретному использованию. Например, некоторые библиотеки C++ предназначены только для заголовков. Компиляция проекта, зависящего от таких библиотек, может стать заметно быстрее с использованием предварительно скомпилированных заголовков.
Заголовки обычно должны быть предварительно скомпилированы в той же системе, где происходит фактическая компиляция. Вам все еще нужно иметь доступ к заголовку. Какова цель «скрытия» заголовочного файла?