Quando compilo il seguente codice in Delphi XE2 per la piattaforma di destinazione a 64 bit di Windows ...Perché ottengo "L'espressione costante viola i subrange bound" per le costanti HKEY_ in Delphi XE2 a 64 bit?
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;
... ricevo avvertimenti per ciascuno dei HKEY_-Costanti: "espressione costante W1012 viola subrange limiti"
ho controllato le dichiarazioni in Winapi.Windows (con Ctrl + Pulsante sinistro sugli identificatori):
type
HKEY = type UINT_PTR;
{...}
const
HKEY_CLASSES_ROOT = HKEY(Integer($80000000));
Questi guardare bene a me. Perché il compilatore pensa ancora che ci sia un problema?
Suoni plausibili, quindi la soluzione sarebbe quella di utilizzare se le dichiarazioni invece? – dummzeuch
Estratto da doc ['# Case_Statements'] (http://docwiki.embarcadero.com/RADStudio/XE3/en/Declarations_and_Statements#Case_Statements):" .. dove selectorExpression è qualsiasi espressione di un tipo ordinale inferiore a 32 bit (stringa tipi e ordinali maggiori di 32 bit non sono validi). " –
@LURD Non prenderò la documentazione XE3 per accurate, quando si tratta di 64 bit (e anche di CrossPlatform). È deprecato per i nuovi obiettivi e non è stato aggiornato (hai ancora riferimenti "Linux" e descrizioni specifiche per Win32 - vedi [ad esempio questa pagina] (http://docwiki.embarcadero.com/RADStudio/XE3/en/ Program_Control)). Ma in questo caso, sembra una vera e propria limitazione - anche se non è obbligatoria, dal punto di vista asm generato, dato che a 64 bit, puoi usare i registri x64 sul backend per controllare il 'caso'. Quindi suppongo che il frontend del compilatore non sia stato aggiornato per il contesto a 64 bit. –