我有一个项目组,其中所有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(“比较有符号和无符号类型”)编译器警告,所有其他项目均未发出警告。
没有一个项目在其use语句或项目文件中具有System.Win.Ctrl。
认为Maxint可能有两种类型化的常量定义,我想在Maxint的前面加上“正确的”单位名称,但找不到其定义。
我搜索了所有可用的c:\ program文件(x86)\ embarcadero \ rad studio \ 9.0 \ source *。*文件,但未找到任何定义。
System.MaxInt有效,但不能消除警告。
Typecasting Cardinal(MaxInt)消除了警告,但我仍然希望使用“完全合格”的解决方案。
(将size_t定义为ULONG_PTR定义为NativeUInt)
我发现了Quality Central问题102873、69836和53202,但是它们引用的是重复定义C ++ .h头文件
我对多个定义的假设正确吗?如果是这样,单位前缀应该是/应该是什么?
最重要的是:为什么我只收到针对一个项目构建的编译器警告?
最佳答案
MaxInt在系统单元中声明。我很确定这是这里唯一的MaxInt。您看到的警告是正确的。 MaxInt已签名,size_t未签名。您应该禁止显示警告。例如,您可以将MaxInt强制转换为size_t:
if size > size_t(MaxInt) then
很好,因为MaxInt在size_t的值范围内。
顺便说一句,我可能会通过挂钩需要修复的功能来处理潜在问题,而不是重新编译整个单元。我个人发现,它具有较小的侵入性,并且易于维护。
为什么我得到那个的编译器警告
仅项目构建?
一些想法:
您只有一个包含该单元的项目。
您在不同的项目中有不同的编译器选项。也许只有一个项目启用了警告,或者只有一个项目启用了该特定警告。
您只有一个定义了WIN32的项目。
该文件仅被编译一次,但是被多次使用。也许是因为您正在建造。
很难解释您的问题的那一部分。无论如何,当问题中的代码在启用警告的情况下编译时,您都会收到该警告。您实际上是在比较带符号和不带符号。因此,您确实需要使用我上面提供的方法来抑制警告。
请记住,警告并不意味着您的代码已损坏。禁止该警告将不会更改代码的行为。当看到警告时,您将分析代码以检查是否存在问题。在这种情况下,代码可以正常工作,您只需要取消警告即可。
关于delphi - maxint在哪里定义-重复定义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13033737/