On 2020-12-01 11:39, Ladislav Karrach via fpc-pascal wrote:
Because MyConst1 is not an *untyped* constant. Only untyped constants
can be used in constant expressions (a pointer to something can be
considered an untyped constant).
The following might work though I did not test it:
=== code begin ===
const
MyStr = 'abc'
MyConst1: AnsiString = MyStr;
MyConst2: TMyRec = (l: Length(MyStr); a: @MyConst1[1]);
=== code end ===
Yes it works, but I must define 2 constants (MyStr and MyConst1),
which is not so nice ;-)
It would be nice to have support for true constants:
const
MyConst1 = 'abc' ;
MyConst2: TMyRec = (l: Length(MyConst1); a: @MyConst1[1]);
But may be that there are technical reasons why it is problematic (may
be that true constants are stored in another memory locations, which
can not be easy addressed)
Yes, that's one of possible reasons.
Regarding Length in constant value assignment - remember that Length is
a function. In case of real constants, the call may be replaced by the
compiler with the constant value. However typed constants may not be
constant, so generic replacement throughout the source code at compile
time is not possible (if it appears in the main body or some function,
the length may already be changed to something else) and selective
replacement may result in a behaviour not expected by the user. The only
questionable case is IMHO the case of {$WRITEABLECONST OFF} - the
compiler _might_ be able to perform the compile-time substition in that
case (and thus allow using Length of such a constant in constant value
assignment), but it doesn't do that in that case either apparently.
Tomas
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal