maxint 在哪里定义 - 重复定义?

Jan*_*gen 3 delphi delphi-xe2

我有一个项目组,其中所有 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;
Run Code Online (Sandbox Code Playgroud)

[此补丁抑制了 midaslib 中的错误 (QC 104337)]

问题:

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

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

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

Dav*_*nan 5

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

if size > size_t(MaxInt) then
Run Code Online (Sandbox Code Playgroud)

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

顺便说一句,我可能会通过挂钩需要修复的函数来处理根本问题,而不是重新编译整个单元。我个人认为这种方式侵入性较小且更易于维护。


为什么我只收到针对该项目构建的编译器警告?

一些想法:

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

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

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