【问题标题】:Is there a way to change a local typed constant from *outside* the routine it's declared in?有没有办法从*外部*它声明的例程中更改局部类型常量?
【发布时间】:2012-03-11 13:18:52
【问题描述】:

请注意,这只是一个思想实验。
我知道全局(静态)变量不好,无论如何打破范围都是一个坏主意。

考虑以下代码:

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

假设已启用可写常量,我如何从声明的函数范围之外更改CanIBeChanged 的值?

PS 不,我不打算使用此代码,这只是一个出于兴趣的问题。

【问题讨论】:

    标签: delphi scope static-variables


    【解决方案1】:

    好吧,它只能通过泄漏指向可写类型常量的指针来完成。这是一个使用相当复杂的方式打印野兽数量的示例:

    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.
    

    由于局部变量的范围仅限于定义它的函数,因此上述方法是唯一可能的解决方案。

    【讨论】:

    • 本地可写常量的存活时间是多少?直到代码离开方法(就像一个普通的局部变量),或者它是共享的?在第一种情况下,您的代码具有未定义的行为。
    • @CodeInChaos 这真是一个奇怪的结构。它们实际上是全局变量。等效于具有静态存储的 C 局部变量。
    • 我依稀记得类似的事情,但现在不确定了。
    • 如果你将inc(I) 移动到inc(I^); 紧跟在Test(I); 之后,它会显得更加顽皮
    • @AndriyM,一件事是暴露他们......但实际上 INC 他们,是更大的顽皮。
    猜你喜欢
    • 2012-05-14
    • 2013-06-27
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 2012-01-11
    相关资源
    最近更新 更多