Mattias Gaertner wrote:
On Thu, 27 Sep 2007 12:38:13 +0200 (CEST)
[EMAIL PROTECTED] (Marco van de Voort) wrote:

[EMAIL PROTECTED] (Marco van de Voort) wrote:
A cast is really a cast. IOW the cast pchar(ansistring) is mostly
a no-op. Traditional C code then usually treats the #0 as end of
string.
PChar(AnsiString) was a no-op typecast in the past and is nowadays a
function. It checks whether the AnsiString is nil and if yes
returns a pointer to a string containing one character: #0.

That means:
Pointer(AnsiString) <> Pointer(PChar(AnsiString))

To get a no-op typecase you can use:
MyPChar:=PChar(Pointer(AnsiString));
Is this delphi compat, and if yes, what is this exactly for?

I don't know.

The change broke some lazarus code and now it is polluted by the ugly
double type casts, just to get some no-op type casts.
Because this fact is not widely known or often forgotten, many use the
PChar() as simple type cast. That's why the lcl interfaces already got
into troubles several times, so everytime we get strange errors I first
search for these typecasts.
Maybe we should mention this fact at a more prominent place in the
wiki and docs.

Maybe also add another "type" to get the OldTypecase behaviour.

I allways thought that casting through Pointer() did return the real allocated data (thus including reference and length)

Marc

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to