Tenir compte l'extrait suivant:Pourquoi les types de pointeurs de caractères suivants sont-ils considérés comme incompatibles?
procedure TForm1.FormCreate(Sender: TObject);
{$REGION 'Sealed declarations'}
type WCh = WideChar; // (1)
type Str = ^WCh; // (2)
{ this routine accepts character pointer }
procedure Baz(Param: Str);
begin
end;
{$ENDREGION}
{ this one too, but character pointer type used directly }
procedure Bar(Param: PWideChar);
begin
end;
{ this constant should be compatible with strings and character pointers }
const FOO = 'FOO';
begin
Bar(FOO); // compiles!
Baz(FOO); // BAH! E2010 Incompatible types: 'Str' and 'string'
end;
Comment puis-je résoudre ce problème préserver à la fois la saisie structurée dans les déclarations et la clarté et la lisibilité de l'utilisation (je l'espère sans transtypage lourd)?
NB: Par "déclarations scellées" je le pense vraiment. Je préfère ne pas le modifier sauf si c'est absolument nécessaire.
La gestion interne de la conversion entre string
et PChar
varie d'une version à l'autre, donc l'environnement peut être important - j'ai rencontré ce problème dans Delphi XE.
Très difficile à comprendre pourquoi vous n'utilisez pas WideChar et PWideChar directement –
Et vous pouvez répondre à votre propre question simplement en se référant à la documentation: http: //docwiki.embarcadero.com/RADStudio/fr/Type_Compatibility_and_Identity –