如何解决为什么Delphi和FreePascal编译器对基于0和基于x的静态数组的处理方式不同?
program test;
uses
sysutils;
const
BUFLEN = 20;
var
Buf0: array[0..BUFLEN-1] of char;
Buf1: array[1..BUFLEN] of char;
s: string;
begin
// Fillchar...
// StrPLCopy...
SetString(s,Buf1,Length(Buf1));
// Error: Incompatible type for arg no. 2: Got "Array[1..20] Of Char",expected "PChar"
SetString(s,Buf0,Length(Buf0));
// compiles ok
end.
在C / C ++中,我们经常使用数组名称作为指针。在Delphi中,我们也可以像上面的示例一样实现。
尽管,在FreePascal的SetString()
中使用Buf1
数组会导致错误,而Buf0
数组可以正常工作。数组的基本索引不重要,对吧?
是否有任何文档证明该行为?
在FPC 3.0.4和Delphi 10.3中进行了测试。
解决方法
如果您查看链接到的定义,则第二个参数可以是以下类型之一:
Buf: PAnsiChar;
Buf: PWideChar;
Buf: PChar;
Buf: PUnicodeChar;
Buf: PChar;
Buf: PWideChar;
Buf: PChar;
如果删除重复项/别名,则可能出现以下情况:
Buf: PAnsiChar;
Buf: PWideChar;
Buf: PUnicodeChar;
在{$ X +}状态下,以下各项之间存在内置的类型兼容性:
PAnsiChar <-> ARRAY[0..nn] OF AnsiChar
PWideChar <-> ARRAY[0..nn] OF WideChar
PUnicodeChar <-> ARRAY[0..nn] OF UnicodeChar
如上所述,所有与PChar类型兼容的Char数组都具有较低的索引0。这就是编译器类型兼容性的工作方式。这样做的原因是,这种类型兼容性主要是为了更轻松地转换C(++)代码,并且C(++)无法指定(普通)数组的下限-它们始终为0
因此,为了保持与C(++)的兼容性,在Delphi / FreePascal中也进行了同样的操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。