2012-03-11 25 views
7

Xin lưu ý rằng đây chỉ là một thử nghiệm suy nghĩ.
Tôi biết toàn cầu (tĩnh) vars là xấu và phạm vi vi phạm là một ý tưởng tồi trong mọi trường hợp.Có cách nào để thay đổi hằng số được nhập cục bộ từ * bên ngoài * thường trình khai báo không?

Xét đoạn mã sau:

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

Giả sử hằng ghi đã được bật, làm thế nào tôi có thể thay đổi giá trị của CanIBeChanged từ bên ngoài phạm vi của hàm nó khai báo trong?

PS Không, tôi không có ý định sử dụng mã này chỉ là một câu hỏi không quan tâm.

Trả lời

12

Vâng, nó chỉ có thể được thực hiện bằng cách rò rỉ một con trỏ đến hằng số có thể ghi. Dưới đây là một ví dụ mà phải mất một cách khá phức tạp để in số lượng con thú:

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. 

Kể từ phạm vi một địa phương được giới hạn chức năng, trong đó nó được định nghĩa, phương pháp nêu trên là chỉ có thể dung dịch.

+0

Đời sống của một const có thể ghi địa phương là gì? Cho đến khi mã rời khỏi phương thức (như một biến cục bộ bình thường), hay nó được chia sẻ? Trong trường hợp đầu tiên, mã của bạn có hành vi không xác định. – CodesInChaos

+1

@CodeInChaos Đó là một cấu trúc thực sự kỳ quái. Chúng thực sự là các biến toàn cục. Tương đương với người dân địa phương với lưu trữ tĩnh. –

+0

Tôi đã mơ hồ nhớ lại điều gì đó như thế, nhưng không chắc nữa. – CodesInChaos

Các vấn đề liên quan