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

时间:2012-10-23 15:17:15

标签: 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;

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

问题:

(较小的)项目中的一个在“MaxInt”行上提供W1023(“比较有符号和无符号类型”)编译器警告,其他所有项目都在没有警告的情况下构建。
没有任何项目在其使用语句或项目文件中具有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)
我发现质量中心问题102873,69836和53202,但这些是指重复定义C ++ .h头文件

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

1 个答案:

答案 0 :(得分:4)

MaxInt在系统单元中声明。我很确定这是范围内唯一的MaxInt。你看到的警告是准确的。 MaxInt已签名且size_t未签名。你应该取消警告。例如,您可以将MaxInt强制转换为size_t:

if size > size_t(MaxInt) then

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

顺便说一下,我可能通过挂钩需要修复的功能来处理底层问题,而不是重新编译整个单元。我个人认为这种侵入性更小,更易于维护。


  

为什么我会收到编译器警告   仅限项目构建?

一些想法:

  1. 您只有一个包含该单元的项目。
  2. 您在不同的项目中有不同的编译器选项。也许只有一个项目启用了警告,或者只有一个项目启用了该特定警告。
  3. 您只有一个定义了WIN32的项目。
  4. 此文件仅编译一次,但多次使用。也许是因为你正在建设。
  5. 很难解释你的部分问题。无论如何,当您的问题中的代码编译并启用警告时,您将收到该警告。你真的在比较签名和未签名。因此,您确实需要使用我在上面提供的方法来抑制警告。

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