有没有办法可以声明一个绝对地址的变量,该变量对它所引用的变量有一些偏移量。例如,而不是:
function RefCount(const s: string): Integer;
begin
Result := PInteger(Integer(s) - 8)^;
end;
我有什么方法可以做:
function RefCount(const s: string): Integer;
var
Count: PInteger absolute s {- 8 ?} ;
begin
Result := Count^;
end;
(这个例子只是为了说明,它不一定有用..)
答案 0 :(得分:7)
不,我不认为有一个扩展的语法' absolute
个关键字。文档是here,据我所知,没有与此关键字相关的未记录的功能。
答案 1 :(得分:4)
您提出的问题没有语法。
但是,您可以使用指针算法(如果您使用的是支持它的版本),例如:
function RefCount(const s: string): Integer;
begin
if s <> '' then
Result := (PInteger(s) - 2)^;
else
Result := 0;
end;
更可靠的方法是使用StrRec
记录类型,这是String
内部实际包含的内容:
function RefCount(const s: string): Integer;
begin
if s <> '' then
Result := (PStrRec(s) - 1)^.refCnt
else
Result := 0;
end;
或者,非指针算术版本:
function RefCount(const s: string): Integer;
begin
if s <> '' then
Result := PStrRec(LongInt(s) - SizeOf(StrRec))^.refCnt
else
Result := 0;
end;
BTW,从D2009 +开始,System
单元有自己的StringRefCount()
函数,可以检索String的引用计数。