“cdecl = nil”(放在函数声明后面)是什么意思?

5

请查看优秀的Detour库的演示源代码

implementation

{$R *.dfm}

var
  TrampolineGetMemory: function(Size: NativeInt): Pointer;
cdecl = nil;

请看cdecl = nil;语句。在这个上下文中,它是什么意思?
注意-我已经知道代表调用约定。

3
相当于 var i: Integer = 42; - David Heffernan
2
@DavidHeffernan 我认为在某些程序中,特定的初始化实际上可以让你获得约一千万年的性能提升。 - J...
2个回答

7
这只是初始化变量的另一种方式。例如:
program Project1;

{$APPTYPE CONSOLE}

var
  i : integer = 5;
begin
  WriteLn(i);
  ReadLn;
end.

如果将其写在一行中,可能会更清晰:

var
  TrampolineGetMemory: function(Size: NativeInt): Pointer; cdecl = nil;

如果定义了类型,那可能会更好:

type
  TTrampolineGetMemory = function(Size: NativeInt): Pointer; cdecl;

//... 
 var
   TrampolineGetMemory: TTrampolineGetMemory = nil;

请注意,这是完全冗余的,因为全局变量会被初始化为“0/nil/false” - 请参见Delphi变量是否默认初始化?。这就像在构造函数中将事件处理程序初始化为nil或将布尔字段初始化为false一样 - 完全没有意义。 - Gerry Coll
@GerryColl 的确如此。有时编码标准会规定这种事情,不是吗?可能是为了清晰明了而显式地写出来,或者可能只是本地人习惯性的反应。虽然这并非必要,但我不确定是否可以称之为错误。 - J...
在构造函数中看到将初始化设为0对我来说是一种代码异味 - 这意味着原始编码者要么不理解Delphi,要么懒得找出默认值是什么。 - Gerry Coll
4
@Gerry 希望读者毫无疑问,不需要思考。 - David Heffernan

7

TrampolineGetMemory 是一个过程变量,其初始值为 nil

如果改写成以下形式,更容易理解:

type
  TTrampolineGetMemory = function(Size: NativeInt): Pointer; cdecl;
var
  TrampolineGetMemory: TTrampolineGetMemory = nil;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接