在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警告。我不明白这一点,因为我认为这个头文件特别是预编译的主要候选者。有谁能解释一下?
答案 0 :(得分:2)
可能与BCB 200x处理默认字符串参数的方式有关。
这样声明的函数会给出“无法生成预编译头”的消息。
void myFunc(const AnsiString ¶m="");
但是,将其更改为此,可以生成预编译的标头。
void myFunc(const AnsiString ¶m = AnsiString(""));
答案 1 :(得分:1)
根据我的经验,该警告信息具有误导性。似乎编译器识别标题可能具有初始化数据的“候选”,然后当它确定文件实际上是正常时,它继续。如果找不到另一个候选人,则不会显示该消息。如果它发现另一个候选人结果是真正的问题,那么它会显示关于第一个候选人的消息。
这使识别真正的罪魁祸首非常困难。
答案 2 :(得分:0)
有一些VCL头文件存在此已知问题:QC 23002。此项目上标记的严重程度虽然是“轻微失败”。
因此,解决方法选项有限:
无论哪种方式,请确保您遇到的那些,CodeGear知道具有该问题的那些头文件。这肯定是长期解决这个问题的最好方法 - 让供应商解决他们的问题。据说CodeGear在其内部测试中有DateUtils.hpp,但在2007年7月发布了(对于QC 2781)。如果问题或某些头文件对您有很大影响,请与他们联系。
答案 3 :(得分:-2)
代码显示时,我收到此警告消息:
#include <vcl.h>
#pragma hdrstop
我通过将这些行交换到:
找到了一个简单的修复方法#pragma hdrstop
#include <vcl.h>
警告不再出现。