PChar/PWideChar/PAnsiChar演员阵容中是否有编译器魔法?

Jen*_*off 1 delphi string pointers casting

我经常读到编译器在转换时会产生某种魔力PChar.

主要目的PChar是在库中调用期望零终止字符数组(C样式"字符串")的外部代码.

PChar是一种类型,它是PWideCharUnicode Delphi的别名,PAnsiChar是非unicode Delphi 的别名.

另一方面,Delphi字符串(string= AnsiString/ UnicodeString,我不是在WideString这里谈论,更不用说ShortString......)有一个隐藏的长度而不是终止字符.它们也被引用计数并在写入时使用副本.

Delphi字符串是否自动分配,并且使用隐式#0 char保持为一个char更长,以便PChar更容易转换为(PAnsiChar/PWideChar),或者编译器在遇到转换时检查并调整字符串PChar

Dav*_*nan 11

过程如下:

  • 如果字符串的s长度大于零,则PChar(s)返回指向字符串内容的第一个元素的指针.因为string被设法有一个隐藏的空终止符,所以不需要做更多的工作.
  • 如果字符串的s长度为零,则PChar(s)返回指向包含空终止符的内存块的指针.

作为实现细节,返回的空终止符是PChar(nil)在已编译模块的只读部分中分配的全局常量.

Delphi字符串是否自动分配,并且使用隐式#0 char保持为一个char更长,以便更容易地向PChar(PAnsiChar/PWideChar)进行转换?

是.

如果可以称之为魔术,那就是:

  1. PChar()在空字符串上使用会返回指向null终止符的指针.
  2. Delphi 在字符串的末尾维护隐藏的空终止符.

  • @Jens - 也许是'编译器内在'?当编译器看到PChar强制转换时,它会生成对'_UStrToPWChar'的调用. (2认同)