1

问题

在 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

4 回答 4

2

One thing that may be related is the way default string parameters are handled by BCB 200x.

Functions declared like this give the "can't generate precompiled header" message.

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

However, change it to this, and the precompiled header can be generated.

void myFunc(const AnsiString &param = AnsiString(""));  
于 2009-06-22T21:51:27.263 回答
1

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

这使得识别真正的罪魁祸首变得极其困难。

于 2012-10-31T14:25:34.010 回答
0

有 VCL 头文件存在此已知问题:QC 23002。但是,该项目上标记的严重性是“轻微故障”。

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

  1. 不使用那些头文件(是的,这确实破坏了这个想法)
  2. 修改头文件(不建议 - 难以跟踪更改,保持最新)。

无论哪种方式,请确保您遇到的那些,CodeGear 了解那些存在该问题的头文件。这肯定是长期解决问题的最佳方式——让供应商解决他们的问题。据说 CodeGear 在他们的内部测试中有 DateUtils.hpp ,但那是在 2007 年 7 月发布的(对于QC 2781)。如果问题或某些头文件对您有很大影响,请与他们联系。

于 2009-06-05T22:03:51.500 回答
-1

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

#include <vcl.h>
#pragma hdrstop

我通过将这些行交换为:

#pragma hdrstop
#include <vcl.h>

不再出现警告。

于 2012-10-31T04:34:48.147 回答