Это текущая слабость GCC (реализация).
Сегодня предварительно скомпилированные заголовки GCC - это, по сути, дамп памяти состояния компилятора сразу после анализа всего заголовка (PCH использует механизм Gcc Garbage Collector с аннотациями GTY внутри источника компилятора и gengtype
). заставить это работать; в основном ggc копирует всю кучу GCC [данные внутри компилятора] внутри вашего PCH.
Для пользователей это означает, что единственный текущий способ получить прибыль от PCH - это иметь ровно один единственный заголовок (который сам будет включать несколько системных заголовков, таких как <stdio.h>
в C или <vector>
в C ++), который включается все ваши *.c
или *.cc
файлы.
Когда GCC компилирует #include
, который не может быть удовлетворен PCH (например, потому что он имеет некоторый код перед it), он просто игнорирует этот PCH. В вашем примере он уже проанализировал некоторые из header.h
перед попыткой загрузки PCH и заметил, что его куча не пуста (некоторые «местоположения», то есть позиции исходного файла уже находятся внутри), поэтому он не может использовать PCH так пропускает это.
Диего Новилло и другие сотрудники Google работают над улучшением этого в PPH филиале GCC. Я понятия не имею, будет ли их работа достаточно зрелой для GCC 4.8
Кстати, я нахожу абсолютно необходимым присутствие сборщика мусора внутри компилятора, но я нахожу GC GCC очень плохим ... (Большинство участников GCC не согласны с моей позицией).