[英]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 ¶m="");
但是,將其更改為此,可以生成預編譯的標頭。
void myFunc(const AnsiString ¶m = AnsiString(""));
根據我的經驗,該警告消息具有誤導性。 似乎編譯器在標頭可能已初始化數據的地方標識了“候選對象”,然后當它確定文件實際上是正確的時,它將繼續。 如果找不到其他候選人,則不會顯示該消息。 如果發現另一個候選人確實是一個真正的問題,那么它將顯示有關第一個候選人的消息。
這使得識別真正的罪魁禍首極為困難。
當代碼顯示時,我收到此警告消息:
#include <vcl.h>
#pragma hdrstop
通過將這些行交換為以下內容,我找到了一個簡單的修復方法:
#pragma hdrstop
#include <vcl.h>
警告不再出現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.