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) 中的错误]

问题:

其中一个(较小的)项目在“MaxInt”行上给出了 W1023(“比较有符号和无符号类型”)编译器警告,所有其他项目都在没有警告的情况下构建。
所有项目的使用语句或项目文件中都没有 System.Win.Ctrl。

考虑到 Maxint 可能有两个类型化的常量定义,我想在 Maxint 前面加上“正确”的单位名称,但找不到它的定义。
我搜索了所有可用的 c:\program files (x86)\embarcadero\rad studio\9.0\source*.* 文件,但没有找到任何定义。
System.MaxInt 有效,但不会消除警告。
类型转换 Cardinal(MaxInt) 删除了警告,但我仍然更喜欢“完全合格”的解决方案。
(size_t 定义为 ULONG_PTR 定义为 NativeUInt)
我发现 Quality Central 问题 102873、69836 和 53202,但这些引用重复定义 C++ .h 头文件

我对多个定义的假设是否正确?如果是这样,单位前缀应该/应该是什么?最重要的是:为什么我只得到那个项目构建的编译器警告?

4

1 回答 1

4

MaxInt 在系统单元中声明。我很确定这是这里范围内唯一的 MaxInt。您看到的警告是准确的。MaxInt 是有符号的,而 size_t 是无符号的。您应该抑制警告。例如,您可以将 MaxInt 转换为 size_t:

if size > size_t(MaxInt) then

这很好,因为 MaxInt 在 size_t 的值范围内。

顺便说一句,我可能会通过挂钩需要修复的函数来处理潜在问题,而不是重新编译整个单元。我个人发现它的侵入性更小,更容易维护。


为什么我只收到一个项目构建的编译器警告?

一些想法:

  1. 您只有一个包含该单元的项目。
  2. 您在不同的项目中有不同的编译器选项。可能只有一个项目启用了警告,或者只有一个项目启用了该特定警告。
  3. 您只有一个定义了 WIN32 的项目。
  4. 该文件只编译一次,但多次使用。也许是因为你正在建造。

很难解释你问题的那一部分。无论如何,当您的问题中的代码在启用警告的情况下编译时,您将收到该警告。你真的在比较有符号和无符号。所以你真的需要用我上面提供的方法来抑制警告。

请记住,警告并不意味着您的代码已损坏。抑制该警告不会改变代码的行为。当您看到该警告时,您会分析代码以检查是否存在问题。在这种情况下,代码可以正常工作,您只需要取消警告。

于 2012-10-23T15:34:42.173 回答