2

すべてのWin32プログラムが同じ..\PatchLibs検索パスを持つプロジェクトグループがあります。このフォルダーには、パッチが適用されたSystem.Win.Ctrl.pasが含まれています。

{$IFDEF WIN32}
function _malloc(size: size_t): Pointer; cdecl;
begin
  if (size > MaxInt) then 
  begin                   
     Result := Nil
  end
  else
  begin
     try
        Result := AllocMem(size);
     except
        Result := Nil;
     end;
  end;
end;

[このパッチはmidaslib(QC 104337)のエラーを抑制します]

問題:

(小さい)プロジェクトの1つは、「MaxInt」行にW1023(「符号付きタイプと符号なしタイプの比較」)コンパイラ警告を表示します。他のすべてのプロジェクトは警告なしでビルドします。
どのプロジェクトにも、usesステートメントまたはプロジェクトファイルにSystem.Win.Ctrlが含まれていません。

Maxintには2つの型付き定数定義があるかもしれないと考えて、Maxintの前に「正しい」単位名を付けたいと思いましたが、その定義が見つかりません。
使用可能なすべてのc:\ programファイル(x86)\ embarcadero \ rad studio \ 9.0 \ source *。*ファイルを検索しましたが、定義が見つかりませんでした。
System.MaxIntは機能しますが、警告を排除しません。
Cardinal(MaxInt)を型キャストすると警告が削除されますが、それでも「完全に修飾された」ソリューションをお勧めします。
(size_tはULONG_PTRがNativeUIntとして定義されているように定義されています)
Quality Centralの問題102873、69836、および53202を見つけましたが、これらは重複した定義C++.hヘッダーファイルを参照しています

複数の定義についての私の仮定は正しいですか?もしそうなら、単位接頭辞は何であるか/すべきですか?そして最も重要なのは、なぜその1つのプロジェクトビルドに対してのみコンパイラの警告が表示されるのですか?

4

1 に答える 1

4

MaxIntはシステムユニットで宣言されています。ここに含まれるMaxIntはこれだけだと確信しています。表示される警告は正確です。MaxIntは符号付きで、size_tは符号なしです。警告を抑制する必要があります。たとえば、MaxIntをsize_tにキャストできます。

if size > size_t(MaxInt) then

MaxIntはsize_tの値の範囲内にあるため、これで問題ありません。

余談ですが、ユニット全体を再コンパイルするのではなく、修正が必要な関数をフックすることで、根本的な問題に対処したいと思います。個人的には、侵襲性が低く、保守が容易であることがわかりました。


その1つのプロジェクトビルドに対してのみコンパイラの警告が表示されるのはなぜですか?

いくつかのアイデア:

  1. そのユニットを含むプロジェクトは1つだけです。
  2. プロジェクトごとに異なるコンパイラオプションがあります。おそらく、プロジェクトの1つだけで警告が有効になっているか、1つのプロジェクトだけでその特定の警告が有効になっています。
  3. WIN32が定義されているプロジェクトは1つだけです。
  4. このファイルは1回だけコンパイルされますが、複数回使用されます。おそらくあなたがむしろ構築しているからでしょう。

あなたの質問のその部分を説明するのはかなり難しいです。いずれにせよ、質問のコードが警告を有効にしてコンパイルされると、その警告が表示されます。あなたは本当に署名されたものと署名されていないものを比較しています。したがって、上記の方法で警告を抑制する必要があります。

警告は、コードが壊れていることを意味するものではないことに注意してください。その警告を抑制しても、コードの動作は変わりません。その警告が表示されたら、コードを分析して問題があるかどうかを確認します。この場合、コードは正常に機能し、警告を抑制する必要があります。

于 2012-10-23T15:34:42.173 に答える