は、私がターゲットプラットフォーム64ビットWindows用のDelphi XE2に次のコードをコンパイルすると... Delphi XE2 64bitのHKEY_-constantsの "Constant expression violation subrange bounds"が表示されるのはなぜですか?
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_-定数のそれぞれに対して警告を得る: 「W1012定数式は、サブレンジに違反します境界」
私は(識別子にはCtrl + Leftclickで)Winapi.Windowsで宣言をチェックする:
type
HKEY = type UINT_PTR;
{...}
const
HKEY_CLASSES_ROOT = HKEY(Integer($80000000));
これらは私には罰金に見えます。なぜコンパイラはまだ問題があると思いますか?
サウンドはそう考えられます。だから、解決策は代わりにif文を使うことでしょうか? – dummzeuch
doc ['#Case_Statements'](http://docwiki.embarcadero.com/RADStudio/XE3/en/Declarations_and_Statements#Case_Statements)からの抽出:" ..ここで、selectorExpressionは32ビットより小さい序数型の式です(string 32ビットより大きい型と序数は無効です)。 " –
@LURD 64ビット(さらにはCrossPlatform)を扱う場合、XE3のドキュメントを正確には取り上げません。新しいターゲットではあまり使用されず、リフレッシュされていません(LinuxのリファレンスとWin32固有の記述があります - このページの例を参照)(http://docwiki.embarcadero.com/RADStudio/XE3/en/ Program_Control))。しかし、この場合、実際の制限のように聞こえます。たとえ必須ではないとしても、生成されたasmの観点からは、64ビットでバックエンドのx64レジスタを使用して 'case'をチェックできます。だから、コンパイラのフロントエンドは64ビットのコンテキストのために更新されていないと思う。 –