请注意,这只是一个思想实验.
我知道全局(静态)变量很糟糕,在任何情况下破坏范围都是一个坏主意.
我知道全局(静态)变量很糟糕,在任何情况下破坏范围都是一个坏主意.
请考虑以下代码:
function IsItChanged: integer; const CanIBeChanged: integer = 0; begin Result:= CanIBeChanged; end;
假设已启用可写常量,如何从声明的函数范围之外更改CanIBeChanged的值?
PS不,我不打算永远使用这个代码,这只是一个有趣的问题.
解决方法
好吧,它只能通过泄漏指向可写入类型常量的指针来完成.这是一个以相当复杂的方式打印野兽数量的例子:
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.