- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我在Delphi XE2中为目标平台64位Windows编译以下代码时...
function HKeyToString(_HKey: HKey): string;
begin
case _HKey of
HKEY_CLASSES_ROOT: result := 'HKEY_CLASSES_ROOT'; // do not translate
HKEY_CURRENT_USER: result := 'HKEY_CURRENT_USER'; // do not translate
HKEY_LOCAL_MACHINE: result := 'HKEY_LOCAL_MACHINE'; // do not translate
HKEY_USERS: result := 'HKEY_USERS'; // do not translate
HKEY_PERFORMANCE_DATA: result := 'HKEY_PERFORMANCE_DATA'; // do not translate
HKEY_CURRENT_CONFIG: result := 'HKEY_CURRENT_CONFIG'; // do not translate
HKEY_DYN_DATA: result := 'HKEY_DYN_DATA'; // do not translate
else
Result := Format(_('unknown Registry Root Key %x'), [_HKey]);
end;
end;
...我收到每个 HKEY_-Constants 的警告:“W1012 常量表达式违反子范围边界”
我检查了 Winapi.Windows 中的声明(在标识符上按 Ctrl+左键单击):
type
HKEY = type UINT_PTR;
{...}
const
HKEY_CLASSES_ROOT = HKEY(Integer($80000000));
这些对我来说看起来不错。为什么编译器仍然认为有问题?
最佳答案
在 64 位编译器上,HKEY_CLASSES_ROOT
的实际值为:
FFFFFFFF80000000
这是因为转换为 Integer
会使 80000000
变成负数。然后转换为无符号会导致 FFFFFFFF80000000
。请注意,该值是正确的。 windows头文件中的声明是:
#define HKEY_CLASSES_ROOT (( HKEY ) (ULONG_PTR)((LONG)0x80000000) )
当您在 C++ 程序中包含头文件并检查 HKEY_CLASSES_ROOT
的值时,它与 Delphi 声明的值完全相同。
然后我们可以从 Delphi 文档中解决这个难题,该文档指出 selectors in a case statement can only be :
any expression of an ordinal type smaller than 32 bits
您别无选择,只能将 case
语句替换为 if
语句。
关于delphi - 为什么在 Delphi XE2 64 位中 HKEY_ 常量为 "Constant expression violates subrange bounds"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14647108/
当我在Delphi XE2中为目标平台64位Windows编译以下代码时... function HKeyToString(_HKey: HKey): string; begin case _HK
我是一名优秀的程序员,十分优秀!