2012-03-11 53 views
7

请注意,这只是一个思想实验。
我知道全局(静态)变量是不好的,在任何情况下,打破范围都是一个坏主意。有没有办法改变一个局部类型的常量* *它在外部声明的例程?

考虑下面的代码:

function IsItChanged: integer; 
const 
    CanIBeChanged: integer = 0; 
begin 
    Result:= CanIBeChanged; 
end; 

假设写常量已启用,我怎么可以从它在声明的功能范围之外的改变CanIBeChanged价值?

PS不,我不打算永远使用这个代码,这只是一个出于兴趣的问题。

回答

12

嗯,它只能通过泄漏指针到可写类型常量来完成。这里是采用一个颇为曲折方式打印的兽的数目的示例:

program NaughtyNaughtyVeryNaughty;{$J+} 
{$APPTYPE CONSOLE} 
procedure Test(out MyPrivatesExposed: PInteger); 
const 
    I: Integer=665; 
begin 
    MyPrivatesExposed := @I; 
    inc(I); 
end; 

var 
    I: PInteger; 
begin 
    Test(I); 
    Writeln(I^); 
    Readln; 
end. 

由于本地的范围被限制在其中它被定义的功能,上面概述的方法的唯一可能的解。

+0

什么是本地可写常量的生存期?直到代码离开方法(如正常的局部变量),还是共享?在第一种情况下,您的代码具有未定义的行为。 – CodesInChaos 2012-03-11 14:08:02

+1

@CodeInChaos这是一个真正奇怪的构造。他们真的是全球变数。等同于静态存储的C本地人。 – 2012-03-11 14:10:28

+0

我隐约记得那样的事情,但不知道了。 – CodesInChaos 2012-03-11 14:12:08

相关问题