簡體   English   中英

為什么C ++ Builder無法創建預編譯的頭文件?

[英]Why is C++Builder failing to create pre-compiled headers?

問題

在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警告。 我不明白這一點,因為我可以想象這個頭文件特別適合進行預編譯。 誰能解釋一下?

可能相關的一件事是BCB 200x處理默認字符串參數的方式。

這樣聲明的函數會給出“無法生成預編譯的標頭”消息。

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

但是,將其更改為此,可以生成預編譯的標頭。

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

根據我的經驗,該警告消息具有誤導性。 似乎編譯器在標頭可能已初始化數據的地方標識了“候選對象”,然后當它確定文件實際上是正確的時,它將繼續。 如果找不到其他候選人,則不會顯示該消息。 如果發現另一個候選人確實是一個真正的問題,那么它將顯示有關第一個候選人的消息。

這使得識別真正的罪魁禍首極為困難。

有些VCL頭文件存在此已知問題: QC 23002 但是,此項目上標記的嚴重性是“輕微故障”。

因此,解決方法選項受到限制:

  1. 不使用那些頭文件(是的,這確實使這個想法失敗了)
  2. 修改頭文件(不建議使用-難以跟蹤更改,請保持最新狀態)。

無論哪種方式,請確保在您遇到的那些文件中,CodeGear知道那些存在該問題的頭文件。 從長遠來看,這肯定是最好的解決方法-讓供應商解決他們的問題。 據說CodeGear在其內部測試中對此具有DateUtils.hpp,但這已於2007年7月發布(對於QC 2781 )。如果問題或某些頭文件對您有很大影響,請與他們聯系。

當代碼顯示時,我收到此警告消息:

#include <vcl.h>
#pragma hdrstop

通過將這些行交換為以下內容,我找到了一個簡單的修復方法:

#pragma hdrstop
#include <vcl.h>

警告不再出現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM