У меня нет особых знаний о внутренностях VC ++. Однако при наличии некоторых знаний о конструкции и теории компилятора то, что представляют собой эти так называемые «предварительно скомпилированные заголовки», не может быть ничем иным, как просто результатом начального лексического анализа и этапов токенизации классической конструкции компилятора.
Рассмотрим простой файл заголовка, который содержит следующее:
#ifdef FOO
#define BAR 10
#else
#undef FOOBAR
class Foo {
public:
void bar();
};
#include "foobar.h"
#endif
Вы должны понимать, что эффект от использования так называемого «предварительно скомпилированного» заголовка должен быть идентичен использованию файла заголовка, как есть.
Здесь вы действительно не знаете, что будет делать этот заголовочный файл. Все зависит от того, какие макросы препроцессора определены при фактическом включении файла заголовка. Вы не знаете, какие макросы будет определять этот файл заголовка. Вы не знаете, какие макросы будут отменены в этом заголовочном файле. Вы не знаете, какие еще файлы заголовков будет включать этот файл заголовка. Вы здесь действительно многого не знаете.
Единственное, что вы можете концептуально сделать, «предварительно скомпилировать» заголовочный файл, - это предварительно проанализировать его. Преобразуйте отдельные элементы языка, отдельные ключевые слова, такие как "#ifdef", "class" и все другие, в отдельные двоичные токены. Удалите все комментарии, пробелы и т. Д.
Первый этап компиляции традиционного языка включает в себя синтаксический анализ исходного текста на внутренние языковые элементы. Лексический анализ и этап токенизации. После анализа отдельных языковых элементов предпринимается попытка выяснить, как полученный проанализированный исходный код должен быть преобразован в объектный модуль. И здесь 99% работы компилятора. Фаза начального лексического анализа на самом деле невелика, но это почти все, что вы можете сделать, чтобы «предварительно скомпилировать» исходный код и сохранить внутреннее двоичное представление токенизированного источника, чтобы эту фазу можно было пропустить, когда реальный код использует "предварительно скомпилированный" исходный код.
Я предполагаю, что VC ++ практически не накладывает ограничений на содержимое предварительно скомпилированных заголовков. Однако, если есть некоторые ограничения - скажем, предварительно скомпилированные заголовки не могут иметь каких-либо условных директив препроцессора (ifdef / ifndef), за исключением классических защитных мер, - тогда можно было бы проделать больше работы для создания предварительно скомпилированных заголовков и сохранить немного больше работы здесь. Другие ограничения на содержимое предварительно скомпилированных заголовков также могут привести к смещению некоторых дополнительных функций в фазу предварительной компиляции.
person
Sam Varshavchik
schedule
08.04.2016
"stdafx.h"
файл, предварительно обработанные, проанализированные и сохраненные в виде дерева синтаксического анализа (если вы не знаете, что это такое, прочтите некоторую теорию компилятора). Это означает, что когда вы включаете такой файл, компилятору не нужно выполнять все эти шаги для файлов заголовков, и компиляция будет быстрее. Файлы заголовков Boost являются хорошими кандидатами для включения в PCH, как и любые внешние (и, возможно, даже некоторые внутренние) заголовки библиотеки. - person Some programmer dude   schedule 08.04.2016