如何在Delphi中实现C语言中静态变量的功能
DELPHI编程 2007-09-02 14:56:01 阅读28 评论0 字号:大中小 订阅
如何在Delphi中实现C语言中静态变量的功能
在函数(function)或过程(procedure)内定义的变量(variable)为局部变量,存放在栈(stack)内,当函数或过程结束时,里面所保存的内容都会随着栈的释放而消失。而在C语言中在定义局部变量时可以用static来定义静态变量,该变量在整个程序的运行中的值一直可以保留,可以为程序实现特殊的功能。但Delphi却没有这一功能,如果为实现这一功能用全局变量显然会破坏程序的封装性,是不可取的。其实这一功能在Delphi中也是可以通过const定义常量的方法来变通实现这一功能。常量本来是不允许在程序中进行修改的,如果想要修改它们的值,有以下两种方法可以实现:
一、通过{$J}的开关来控制编译器是否允许程序修改常量
根据Delphi的帮助文档描述:$J指令控制是否允许定义为常量的值是否允许被修改。在{$J+}状态,定义的常量可以被修改,常量在此时相当于一个可以被初始化数值的变量。在{$J-}状态定义的常量是真正的常量,任何尝试对常量的修改都会使编译器报错。具体示例如下:
{$J+}
procedure TForm1.Button1Click(Sender: TObject);
const i:integer=100;
begin
i:=i+100;
showmessage(inttostr(i));
end;
{$J-}
需要说明的是,早期的Delphi或PASCAL版本,常量都是可写的,相当于{$J+}状态,以前的源代码在使用可写常量需要重新编译时必须使用{$J+}进行编译。
二、通过指针来实现此功能
通常用Delphi来写程序很少会用到指针,其实Delphi的指针功能和C语言的指针功能一样的强大,此处不做过多讲述。如果想要修改常量的值的话,可以定义一个指针变量,使用指针指向此常量的地址,然后通过指针来修改常量。具体示例如下:
procedure TForm1.Button1Click(Sender: TObject);
const i:integer=100;
var p:PInteger;
begin
p:=@i;
P^:=p^+100;
showmessage(inttostr(i));
end;
如果不是出于使用静态变量的目的,建议最好不要使用以上两种方法,更不要通过这种方法来改变全局常的值,那样会对程序带来灾难性的后果。必须使用的话,建议使用第一种方法,使用完后应尽快使用{$-}来关掉改写常量功能。
原帖地址:http://hunto.blog.163.com/blog/static/147405269200782256158/