Можно ли в GCC предварительно скомпилированные заголовки быть включены из других заголовков? - PullRequest
1 голос
/ 06 марта 2012

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

// test.c++
#include <precompiled.h>
#include <header.h>
main() {}

> g++-4.7 --std=c++11 BLAH... test.c++ -H 2>&1 | grep precompiled.h
! precompiled.h.gch

(! Означает, что gcc нашел и использовал предварительно скомпилированный заголовок)

Однако, когда яположить #include в header.h, это не работает:

// test.c++
#include <header.h>
main() {}

> g++-4.7 --std=c++11 BLAH... test.c++ -H 2>&1 | grep precompiled.h
. precompiled.h

(нет! или x означает, что gcc не удалось найти предварительно скомпилированный заголовок)

Чтопродолжается?Насколько я понимаю, до тех пор, пока gcc попадет в #include, который указывает на заголовок с соответствующим .gch перед любыми токенами C / C ++, он будет использовать GCH, что подсказывает мне, что с подключением должно быть все в порядке.

Я ошибаюсь?

Ответы [ 2 ]

4 голосов
/ 07 марта 2012

Это текущая слабость 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 не согласны с моей позицией).

1 голос
/ 07 марта 2012

Это оказалось ошибкой в ​​документации.Gcc больше не поддерживает предварительно скомпилированные заголовки в подлинку:

Ошибка в файле: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52518

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...