[fpc-pascal] Initialization of constant record member of pointer type

LacaK lacak at zoznam.sk
Wed Dec 2 16:01:16 CET 2020


Dňa 2.12.2020 o 13:55 Tomas Hajny via fpc-pascal napísal(a):
> 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.

Yes I have no problem with {$WRITEABLECONST OFF} if it will allow Length().

Somewhere I read (may be in Delphi documentation) that some intristic 
functions like Low(), High(), Pred() and also Length() etc. can be used 
in constant expressions because compiler can evaluate them if theirs 
arguments are also constants.
Which is the case in my example.
For now {$WRITEABLECONST OFF} does not help ;-)

-Laco.




More information about the fpc-pascal mailing list