我有一个项目组,其中所有 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 头文件
我对多个定义的假设是否正确?如果是这样,单位前缀应该是什么?最重要的是:为什么我只收到该项目构建的编译器警告?
MaxInt 在系统单元中声明。我很确定这是这里范围内唯一的 MaxInt。您看到的警告是准确的。MaxInt 有符号,size_t 无符号。您应该抑制该警告。例如,您可以将 MaxInt 转换为 size_t:
if size > size_t(MaxInt) then
Run Code Online (Sandbox Code Playgroud)
这很好,因为 MaxInt 在 size_t 的值范围内。
顺便说一句,我可能会通过挂钩需要修复的函数来处理根本问题,而不是重新编译整个单元。我个人认为这种方式侵入性较小且更易于维护。
为什么我只收到针对该项目构建的编译器警告?
一些想法:
很难解释你问题的这一部分。无论如何,当您问题中的代码在启用警告的情况下编译时,您将收到该警告。您实际上是在比较有符号和无符号。所以你确实需要用我上面提供的方法来抑制警告。
请记住,警告并不意味着您的代码已损坏。抑制该警告不会改变代码的行为。当您看到该警告时,您可以分析代码以检查是否存在问题。在这种情况下,代码可以正常工作,您只需抑制警告即可。