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

関連する可能性があることの 1 つは、デフォルトの文字列パラメーターが BCB 200x によって処理される方法です。

このように宣言された関数は、「プリコンパイル済みヘッダーを生成できません」というメッセージを表示します。

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

ただし、これに変更すると、プリコンパイル済みヘッダーが生成されます。

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 に答える