Delphi编译器警告:将有符号传递给无符号
我最近尝试在我的应用程序中使用范围检查,试图捕获数组边界冲突等 不幸的是,这导致了许多与Delphi编译器警告:将有符号传递给无符号,delphi,delphi-xe6,Delphi,Delphi Xe6,我最近尝试在我的应用程序中使用范围检查,试图捕获数组边界冲突等 不幸的是,这导致了许多与HRESULT相关的非错误: var hr: HRESULT; begin hr := E_UNEXPECTED; ShowMessage(SysErrorMessage(hr)); 调用SysErrorMessage失败,出现ERangeError。这是因为: HRESULT = type Longint; { from wtypes.h } function SysError
HRESULT
相关的非错误:
var
hr: HRESULT;
begin
hr := E_UNEXPECTED;
ShowMessage(SysErrorMessage(hr));
调用SysErrorMessage
失败,出现ERangeError。这是因为:
HRESULT = type Longint; { from wtypes.h }
function SysErrorMessage(ErrorCode: Cardinal): string;
手工打字
解决方案很简单:每次我将HRESULT
传递到syserromessage
时,手动强制转换到Cardinal
这对于我正在处理的当前项目中的代码来说已经足够好了-搜索syserromessage
,并扫描结果以查找我可能传递的HRESULT
:
var
hr: HRESULT;
begin
hr := E_UNEXPECTED;
ShowMessage(SysErrorMessage(hr));
但当共享库中有代码时,它就失败了。当我将有符号的数据传递给无符号的数据时,它也会失败,反之亦然
编译器能告诉我吗?
当我混合使用有符号和无符号类型时,编译器是否有要捕获的警告选项?显然,我要禁用范围检查
另见
int WSAAPI getaddrinfo(
_In_opt_ PCSTR pNodeName,
_In_opt_ PCSTR pServiceName,
_In_opt_ const ADDRINFOA *pHints,
_Out_ PADDRINFOA *ppResult
);
Jcl/Jvcl有很多工作要做
当我混合使用有符号和无符号类型时,编译器是否有要捕获的警告选项
W1024将收集混合算术和比较。但在编译时没有赋值或参数传递,这与赋值基本相同 所有将
HResult
值传递到SysErrorMessage
的代码都是错误的。该函数调用FormatMessage
,该函数用于格式化Win32错误代码,而不是COM错误代码。对您的第四个“请参阅”链接的回复地址为。如果COM错误代码以FACILITY\u WIN32
开头,则可以剥离这些位(如HResultFromWin32
)并将生成的代码传递给SysErrorMessage
,但如果SysErrorMessage
实际上一直在处理COM错误代码,这是您无论如何都不应该依赖的未记录行为。很不幸,WinSock函数返回有符号整数,但实际上没有问题,因为它们返回的所有错误代码都是正数,因此,没有超过基数界限的危险。@RobKennedy:要从使用FACILITY\u Win32
的HRESULT
中提取Win32错误代码,必须使用HRESULT\u code()
,而不是HResultFromWin32()
。但即使如此,也不可能总是将这样的HRESULT
转换为Win32错误代码。请参阅陈雷蒙关于这个问题的博客:@RobKennedy。在输入的过程中,它们也会强制将类型转换为uint
。此外,FormatMessage可以接受HRESULT。但它只会在系统错误的情况下产生有意义的结果。