为什么C ++ Builder无法创建预编译的头文件?

时间:2009-06-05 16:06:55

标签: c++ c++builder c++builder-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 个答案:

答案 0 :(得分:2)

可能与BCB 200x处理默认字符串参数的方式有关。

这样声明的函数会给出“无法生成预编译头”的消息。

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

但是,将其更改为此,可以生成预编译的标头。

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

答案 1 :(得分:1)

根据我的经验,该警告信息具有误导性。似乎编译器识别标题可能具有初始化数据的“候选”,然后当它确定文件实际上是正常时,它继续。如果找不到另一个候选人,则不会显示该消息。如果它发现另一个候选人结果是真正的问题,那么它会显示关于第一个候选人的消息。

这使识别真正的罪魁祸首非常困难。

答案 2 :(得分:0)

有一些VCL头文件存在此已知问题:QC 23002。此项目上标记的严重程度虽然是“轻微失败”。

因此,解决方法选项有限:

  1. 不使用那些头文件(是的,确实打败了这个想法)
  2. 修改标题文件(不建议 - 难以跟踪更改,保持最新状态。)
  3. 无论哪种方式,请确保您遇到的那些,CodeGear知道具有该问题的那些头文件。这肯定是长期解决这个问题的最好方法 - 让供应商解决他们的问题。据说CodeGear在其内部测试中有DateUtils.hpp,但在2007年7月发布了(对于QC 2781)。如果问题或某些头文件对您有很大影响,请与他们联系。

答案 3 :(得分:-2)

代码显示时,我收到此警告消息:

#include <vcl.h>
#pragma hdrstop

我通过将这些行交换到:

找到了一个简单的修复方法
#pragma hdrstop
#include <vcl.h>

警告不再出现。