delphi分配给const?

时间:2010-12-02 13:40:05

标签: delphi const

此网站:http://www.drbob42.com/delphi/wizards.htm

在底部显示了一个非常令人费解的代码

 unit ShareMem;
 { (c) 1997 by Bob Swart (aka Dr.Bob - http://www.drbob42.com }
 interface

 const
...
 uses
   Windows;

 const
   Handle: THandle = 0;
...
 function GetCommandLine: PChar; stdcall;
   external 'kernel32.dll' name 'GetCommandLineA';
...
   begin
     Handle := LoadLibrary('BCBMM.DLL');
 end.
这怎么可能?

3 个答案:

答案 0 :(得分:6)

Delphi有一个称为可分配的consts,允许分配const值。这可以通过编译器指令和开关打开/关闭。如需更长的答案,请参阅here

有时在课程属性可能之前,它会派上用场。即使const在函数内声明,它也会在调用之间保持其值。

procedure Test;
{$WRITEABLECONST ON}
const
  AssignableConst: Integer = 0;
{$WRITEABLECONST OFF}
begin
  AssignableConst := AssignableConst + 1; 
  WriteLn('Test is called ' + IntToStr(AssignableConst) + ' times'); 
end;

答案 1 :(得分:4)

默认情况下输入const(编辑:正如评论中的Rob所述,这已被更改为不再是多年前的默认值),更像是一个静态变量。 You can turn this behavior off with a compiler directive

这在旧版本的Delphi中通常用作class/static properties的替代品。现在Delphi实际上有这个功能,没有充分的理由去做这个恕我直言。

答案 2 :(得分:1)

你想知道的是writable typed constant。从Turbo Pascal的旧时代开始,键入的常量是可写的。事实上,这是声明初始化变量的唯一方法。在内部,可写类型常量和初始化变量是等效的,都进入DATA段(这就是 Lars Truijens 的示例如何工作)。此外,类型常量可以包含不允许真正常量的数据类型,它们的真正语义目的是什么。自Delphi 4(或3甚至?)以来,Borland想出了将常量和变量混合在一起的奇怪之处,并引入了初始化全局变量$WRITEABLECONST switch指令(默认情况下为OFF)。初始化变量不能出现在本地范围内,因此仍然存在可写类型常量的目的。