Почему C++Builder не может создать предварительно скомпилированные заголовки?

Проблема

В CodeGear C++Builder 2009 мы используем внедрение предварительно скомпилированного заголовка, чтобы значительно сократить время компиляции. У нас есть один и тот же заголовочный файл, внедряемый в несколько проектов. При компиляции некоторых проектов компилятор выдает следующее предупреждение:

[BCC32 Warning] Dateutils.hpp(43): W8058 Cannot create pre-compiled header: initialized data in header

В этом примере Dateutils.hpp — это файл, на который он жалуется (заголовок CodeGear). Я видел, как это происходит и с другими заголовками. Что делает это интересным, так это то, что это происходит только с некоторыми проектами (вводится один и тот же заголовок).

В прошлом мне приходилось просто находить заголовок, который в конечном итоге включал этот ошибочный файл, и удалять его из моего предварительно скомпилированного файла заголовка. Кто-нибудь знает, что здесь происходит и как это исправить?

Обновлять

Я закончил тем, что выполнил подход к исключению из заголовочного файла и пришел к интересному выводу, который я не могу объяснить. Из более чем 50 включенных заголовков, когда я удалил vcl.h, я больше не получаю предупреждения W8058. Я не понимаю этого, поскольку я полагаю, что этот заголовочный файл, в частности, является главным кандидатом на предварительную компиляцию. Кто-нибудь может это объяснить?


person Scott Saad    schedule 05.06.2009    source источник


Ответы (4)


Одна вещь, которая может быть связана, — это то, как параметры строки по умолчанию обрабатываются BCB 200x.

Функции, объявленные таким образом, выдают сообщение «невозможно сгенерировать предварительно скомпилированный заголовок».

void myFunc(const AnsiString &param="");  

Однако измените его на это, и можно будет сгенерировать предварительно скомпилированный заголовок.

void myFunc(const AnsiString &param = AnsiString(""));  
person Roddy    schedule 22.06.2009
comment
Действительно? Не знала и обязательно попробую. Спасибо! - person Scott Saad; 23.06.2009
comment
К сожалению, в подобном случае это не помогает: CGXDLMSProfileGeneric(std::string ln = std::string(), unsigned short sn = 0); - person truthseeker; 07.03.2018

По моему опыту, это предупреждающее сообщение вводит в заблуждение. Кажется, что компилятор идентифицирует «кандидатов», где заголовок может инициализировать данные, а затем, когда он определяет, что файл действительно в порядке, он продолжает. Если он не найдет другого кандидата, он не покажет сообщение. Если он находит другого кандидата, который оказывается реальной проблемой, он показывает сообщение о первом кандидате.

Это делает установление истинного виновника чрезвычайно трудным.

person David Dean    schedule 31.10.2012

Существуют заголовочные файлы VCL с этой известной проблемой: QC 23002. Однако отмеченная серьезность этого элемента — «незначительная неисправность».

Таким образом, варианты обходного пути ограничены:

  1. Не использовать эти файлы заголовков (что, да, противоречит идее)
  2. Измените файлы заголовков (не рекомендуется — трудно отслеживать изменения, сохраняйте их в актуальном состоянии).

В любом случае, убедитесь, что из тех, с которыми вы сталкиваетесь, CodeGear знает о тех заголовочных файлах, которые имеют эту проблему. Это, безусловно, будет лучшим способом решить эту проблему в долгосрочной перспективе — пусть поставщик решит свою проблему. Предположительно CodeGear имеет DateUtils.hpp во внутренних тестах для этого, но это было опубликовано (для QC 2781) в июле 2007 г. Если проблема или определенные заголовочные файлы существенно влияют на вас, свяжитесь с ними по этому поводу.

person Kris Kumler    schedule 05.06.2009

Я получаю это предупреждающее сообщение, когда код показывает:

#include <vcl.h>
#pragma hdrstop

Я нашел простое исправление, заменив эти строки на:

#pragma hdrstop
#include <vcl.h>

Предупреждение больше не появляется.

person Dwight    schedule 31.10.2012
comment
Это фактически отключает предварительно скомпилированные заголовки. #pragma hdrstop сообщает компилятору, когда он может перестать искать заголовки. Чтобы pch работал (и работал хорошо), каждый из ваших файлов cpp должен выглядеть одинаково до этой прагмы, и все файлы, которые вы хотите предварительно скомпилировать, должны быть над ней. - person David Dean; 31.10.2012