GCC и предварительно скомпилированные заголовки
После прочтенияэта хорошая статья (Уход и подача предварительно скомпилированных заголовков), у меня есть некоторые сомнения относительно того, как они могут реально работать в реальной жизни. В частности, как я могу узнать, что мне нужно запустить пересборку предварительно скомпилированного заголовка в следующих сценариях:
Я решил#define
что-то в одном из моих файлов .cpp, которое изменяет способ, которым препроцессор интерпретирует некоторые заголовки, которые уже включены в мой предварительно скомпилированный заголовокЯ включаю другой заголовок в один из моих файлов .cpp, который#define
s специальная директива препроцессора, которая изменяет способ, которым препроцессор интерпретирует заголовок, уже включенный в предварительно скомпилированный заголовокХуже того, предыдущая проблема может возникать рекурсивно, когда определенные заголовки#include
другие заголовкиЕсли использование предварительно скомпилированных заголовков обеспечивает определенный стиль кодирования, такой как ограничение количества заголовков, включенных в файлы .cpp, до одного и никогда#define
Вещи в файл .cpp?
В то время как MicrosoftКомпилятор, вероятно, делает достойную работу с предварительно скомпилированными заголовками (применяя некоторые специфичные для MS voodoo), потому что, насколько я знаю, он обеспечивает/Yc
а также/Yu
опции, которые должны выполнять всю работу по сантехнике, для GCC кажется, что эта функциональность требует много ручной работы и творчества в Makefile, и я нене может найти шаблон, который должен решить все ловушки использования предварительно скомпилированных заголовков.
Например, если у меня есть проект, который собирает несколько библиотек, чтобы не перестраивать их все после каждого изменения, я должен использовать несколько очень симпатичныхsed
трюки в Makefile, чтобы обнаружить, если один из заголовков#include
д текущей библиотекой был изменен (или#include
измененный заголовок). Я боюсь даже думать о тех сложностях, которые на самом деле подразумевают предварительно собранные заголовки, чтобы скрипт сборки перестраивал их каждый раз, когда это необходимо.