Das macht der Compiler schon und ersetzt den Ausdruck Low(string)
entweder mit 0 oder 1.
Jupp, daher geht auch ein
{$IF Low(string) = 0}
, da Low(string) eine echte Konstante darstellt und bereits vom Compiler interpretiert wird.
Low(string) wird im Compiler bestimmt und eventuell sogar wegoptimiert.
MyString[Low(string)] wird immer auf 0 runtergerechnet, denn egal ob 1-Index oder 0-basierend ... intern wird es immer ein Offest 0 sein.
Wie an meinem Beispielen gezeigt, muß man in seinem Code auch garnichts entscheiden/berechnen.
Also entweder man arbeitet mit der "aktuellen" Indexberechnung, oder man arbeitet einfach immer mit einem bestimmten Offset und stellt den Code entsprechend ein.
Nur eine Ausnahme gibt es. Bei einer eigenen lokalen Compilereinstellung, muß man aufpassen, dass Indize zu externen Funktionen entsprechend umgerechnet werden, z.B. bei Verwendung von "externen" Funktionen wie Copy.
Delphi-Quellcode:
procedure TForm5.FormCreate(Sender: TObject);
begin
var S := 'abc';
{$ZEROBASEDSTRINGS OFF}
Caption := Caption + ' ' + Low(string).ToString + S[1] + Copy(S, 1, 1);
{$ZEROBASEDSTRINGS ON}
Caption := Caption + ' ' + Low(string).ToString + S[1] + Copy(S, 1, 1);
end;
1aa 0ba
{$ZEROBASEDSTRINGS ...}
im Code gilt immer nur für die aktuelle
Unit,
also ist die ganze
Unit unter der eigenen Kontrolle, dann reicht es einmal zu Beginn der
Unit,
und man muß sich nicht mühevoll den Zustand merken und reverten.
Genauso, wie bei Vielen der anderen Compilerschalter.