Delphi 将有符号传递给无符号的编译器警告
Delphi compiler warning for passing signed to unsigned
我最近尝试在我的应用程序中使用范围检查,试图捕获数组边界违规等
不幸的是,这导致了很多与 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
传递给 SysErrorMessage
时手动强制转换为 Cardinal
。
这对于我正在处理的当前项目中的代码来说已经足够好了 - 搜索 SysErrorMessage
并扫描我可能传递 HRESULT
:[=29 的位置的结果=]
但是当共享库中有代码时失败。当可能存在其他结构时,它也会失败,我正在将有符号传递给无符号,反之亦然。
编译器能直接告诉我吗?
当我混合使用有符号和无符号类型时,编译器是否有一个警告选项来捕捉?显然我要禁用范围检查。
另见
- Preventing "combining signed and unsigned types widened both operands" compiler warning
- Range checking
- [D2009] I think SysErrorMessage is wrong...
奖金
所有WinSock函数return整数:
int WSAAPI getaddrinfo(
_In_opt_ PCSTR pNodeName,
_In_opt_ PCSTR pServiceName,
_In_opt_ const ADDRINFOA *pHints,
_Out_ PADDRINFOA *ppResult
);
int WSAGetLastError(void);
Jcl/Jvcl 有很多修复工作要做。
Does the compiler have a warning option to catch when i mix signed and unsigned types?
W1024 将收集混合算术和比较。但是在编译时并没有什么赋值或者参数传递,这和赋值本质上是一样的。
我最近尝试在我的应用程序中使用范围检查,试图捕获数组边界违规等
不幸的是,这导致了很多与 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
传递给 SysErrorMessage
时手动强制转换为 Cardinal
。
这对于我正在处理的当前项目中的代码来说已经足够好了 - 搜索 SysErrorMessage
并扫描我可能传递 HRESULT
:[=29 的位置的结果=]
但是当共享库中有代码时失败。当可能存在其他结构时,它也会失败,我正在将有符号传递给无符号,反之亦然。
编译器能直接告诉我吗?
当我混合使用有符号和无符号类型时,编译器是否有一个警告选项来捕捉?显然我要禁用范围检查。
另见
- Preventing "combining signed and unsigned types widened both operands" compiler warning
- Range checking
- [D2009] I think SysErrorMessage is wrong...
奖金
所有WinSock函数return整数:
int WSAAPI getaddrinfo(
_In_opt_ PCSTR pNodeName,
_In_opt_ PCSTR pServiceName,
_In_opt_ const ADDRINFOA *pHints,
_Out_ PADDRINFOA *ppResult
);
int WSAGetLastError(void);
Jcl/Jvcl 有很多修复工作要做。
Does the compiler have a warning option to catch when i mix signed and unsigned types?
W1024 将收集混合算术和比较。但是在编译时并没有什么赋值或者参数传递,这和赋值本质上是一样的。