2012-03-11 27 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

相關問題