Delphi有这个列表: Delphi 内在例程
但是该列表不完整。
有哪7个未记录的内在函数,自何时起以及其目的是什么?
Delphi有这个列表: Delphi 内在例程
但是该列表不完整。
有哪7个未记录的内在函数,自何时起以及其目的是什么?
function Default(T: Typeidentifier): value of T;
T
的零表示。function IsManagedType(T: TypeIdentifier): Boolean;
如果T
是一个接口
、字符串
或动态数组
,或者包含这些类型的记录,则为真。包含受管理类型的类将返回false。
在XE6及更早版本中,您需要使用System.Rtti.IsManaged(TypeInfo(T))
。
HasWeakRef
function HasWeakRef(T: TypeIdentifier): Boolean;
T
被注释为[weak]
,则返回True。编译器会保留[weak]
引用列表。这些类型不能使用move
和其他技巧,因为那样会阻止弱引用列表得到更新。System.TypInfo.HasWeakRef(TypeInfo(T))
。
GetTypeKind
function GetTypeKind(T: TypeIdentifier): TTypeKind;
这个函数和PTypeInfo(System.TypeInfo(T))^.Kind;
做的事情相同,但由于它是编译器内置的,所以该函数在编译时被解析,而评估为false的条件代码将被编译器剥离。
IsConstValue
function IsConstValue(const Value): Boolean;
如果Value是常量,则为True,否则为False。
这有助于编译器消除死代码,因为函数在编译时被评估。
这仅在内联函数中有用,因为它允许生成更短的代码。
TypeInfo
function TypeInfo(T: typeindentifier): PTypeInfo;
if TypeInfo(T) = TypeInfo(byte) then ...
不会生成任何代码,并且测试将在编译时解析。然而,编译时解析仅在泛型例程内部工作,并且仅在执行if (TypeInfo(T) = TypeInfo(sometype)
测试时才有效。测试if TypeInfo(byte) = TypeInfo(smallint) then
即使始终计算为false也不会被消除。其他使用TypeInfo(T)
也一样。
ReturnAddress
以下内容与raise exception at returnaddress
结构一起使用。
function ReturnAddress(Expression): pointer; //Delphi ?
function AddressOfReturnAddress(Expression): pointer; //Delphi ?
据我所知,您无法直接从用户代码中调用它们。
IsConstValue
的示例
type TFlavor = (Tasty, Nasty); TIntegerHelper = record helper for integer function GetSomething(Flavor: TFlavor): TPoint; inline; private function GetTastyPoint: TPoint; function GetNastyPoint: TPoint; end; function TIntegerHelper.GetSomething(Flavor: TFlavor): TPoint; begin if IsConstValue(Flavor) then begin if Flavor = Tasty then Result:= Self.GetTastyPoint else Result:= Self.GetNastyPoint; end else begin Assert(1=0, '此函数只能使用常量参数调用'); end; end; procedure Test; var pt: TPoint; begin pt:= 100000.GetSomething(Tasty);此调用将被转换为GetTastyPoint,并且链接器将消除if/then
序列。