zig*_*zig 7 delphi delphi-7 delphi-5
我在Delphi Detours库中有这个代码,我正在尝试移植:
type
TInstruction = record
Archi: Byte; { CPUX32 or CPUX64 ! }
AddrMode: Byte; { Address Mode }
Addr: PByte;
VirtualAddr: PByte;
NextInst: PByte; { Pointer to the Next Instruction }
OpCode: Byte; { OpCode Value }
OpType: Byte;
OpKind: Byte;
OpTable: Byte; { tbOneByte,tbTwoByte,... }
OperandFlags: Byte;
Prefixes: Word; { Sets of Prf_xxx }
...
end;
var
Inst: TInstruction;
begin
...
Inst := default (TInstruction); // <-
Inst.Archi := CPUX;
Pvt := PPointer(AIntf)^; // vTable !
PCode := PPointer(Pvt + Offset)^; // Code Entry !
Inst.NextInst := PCode;
...
end;
Run Code Online (Sandbox Code Playgroud)
" default"关键字有什么作用?我假设像:
FillChar(Inst, SizeOf(TInstruction), 0);
Run Code Online (Sandbox Code Playgroud)
我的假设是否正确?
Dav*_*nan 15
Default()是一个无证的内在函数,用于支持泛型.Delphi泛型的设计深受.net泛型的启发,您可以从.net阅读相似的文档中获益:https://msdn.microsoft.com/en-GB/library/xwth0h0d.aspx
目的Default()是允许您默认初始化变量.使用泛型类型时,Default()可以对类型为泛型的变量执行此操作.
如果您希望复制行为,Default()请执行以下操作:
Finalize(Inst);
FillChar(Inst, SizeOf(Inst), 0);
Run Code Online (Sandbox Code Playgroud)
如果Finalize管理类型,则需要调用.也就是说,如果管理类型,或包含任何受管理的成员.托管类型包括字符串,动态数组,接口,变体,匿名方法等.
如果类型不包含托管类型,则Finalize可以省略调用.但是,包含它并没有什么坏处,因为如果不需要,编译器将消除它.如果您可以100%确定没有为托管类型分配值,那么您也可以省略该调用.
默认初始化表示以下内容:
False 对于布尔类型.#0 对于字符类型.Variant.nil 用于类,动态数组,接口和匿名方法.| 归档时间: |
|
| 查看次数: |
597 次 |
| 最近记录: |