2012-03-11 13 views
7

これは単なる実験的な実験です。
私はグローバル(静的)バールが悪いことを知っていますし、どのような場合でもスコープを破ることは悪い考えです。どのように私はそれがで宣言されています関数のスコープ外からCanIBeChangedの値を変更することができ、有効になっている書き込み可能な定数を仮定し宣言されたルーチンからローカルの型付き定数を変更する方法はありますか?

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

は、次のコードを考えてみましょうか?

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

ローカル書き込み可能なconstの有効期間はどのくらいですか?コードがメソッドを離れるまで(通常のローカル変数のように)、それとも共有されるのですか?最初のケースでは、コードに未定義の動作があります。 – CodesInChaos

+1

@CodeInChaosそれは本当に奇妙な構造です。彼らは本当にグローバル変数です。静的記憶域を持つCのローカルに相当します。 –

+0

私はそのようなことを漠然と思い出していましたが、もはやこれは確かではありませんでした。 – CodesInChaos

関連する問題