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