Почему C ++ Builder не может создать предварительно скомпилированные заголовки? - PullRequest
1 голос
/ 05 июня 2009

Задача

В 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. Я не понимаю этого, так как представляю, что этот заголовочный файл, в частности, является основным кандидатом на предварительную компиляцию. Кто-нибудь может это объяснить?

Ответы [ 4 ]

2 голосов
/ 23 июня 2009

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

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

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

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

void myFunc(const AnsiString &param = AnsiString(""));  
1 голос
/ 31 октября 2012

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

Это крайне затрудняет выявление реального преступника.

0 голосов
/ 31 октября 2012

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

#include <vcl.h>
#pragma hdrstop

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

#pragma hdrstop
#include <vcl.h>

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

0 голосов
/ 06 июня 2009

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

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

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

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

...