2012-03-11 19 views
7

Lütfen bunun sadece bir düşünce deneyi olduğunu unutmayın.
Küresel (statik) varsların kötü olduğunu ve kırılmaların kapsamının her durumda kötü bir fikir olduğunu biliyorum. nasıl bunu beyan ediyor işlevin kapsamı dışında CanIBeChanged değerini değiştirebilir, etkinleştirilmiş yazılabilir sabitleri varsayarsakYerel tiplenmiş bir sabiti * dışında bildirilen rutini değiştirmenin bir yolu var mı?

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

:

Aşağıdaki kodu düşünün?

PS Hayır Bu kodu hiç kullanma niyetinde değilim, sadece ilgi çekici bir soru.

cevap

12

Bu, yalnızca yazılabilir yazılan sabitlere bir işaretçi sızarak yapılabilir. Yerel etki alanı içinde tanımlandığı edildiği fonksiyonu ile sınırlı olduğundan

, yukarıda özetlenen yaklaşım mümkün okunur
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. 

: İşte canavarın sayısını yazdırmak için oldukça dolambaçlı bir yol alır bir örnektir çözüm.

+0

Yerel yazılabilir bir const dosyasının süresi nedir? Kod, yöntemden ayrılıncaya kadar (normal bir yerel değişken gibi) veya paylaşılıyor mu? İlk durumda kodunuzun tanımlanmamış bir davranışı vardır. – CodesInChaos

+1

@CodeInChaos Gerçekten tuhaf bir yapı. Onlar gerçekten küresel değişkenlerdir. Statik depolama ile C yerlileri ile eşdeğerdir. –

+0

Böyle bir şey hatırlamaya çalışıyordum, ama artık emin değildim. – CodesInChaos

İlgili konular