【问题标题】:Is possible to mark an entire const block as deprecated?是否可以将整个 const 块标记为已弃用?
【发布时间】:2014-12-04 14:07:35
【问题描述】:

我知道您可以将单个常量标记为已弃用

const
  NotDeprConst1 = 1;
  DeprConst = 2 deprecated;
  NotDeprConst2 = 2;

但是,您能否将整个 const 块标记为已弃用而不一一标记常量?

我想做这样的事情:

const deprecated
  DeprConst1 = 1;
  DeprConst2 = 2;
  DeprConst3 = 3;

然而,这并不能编译(编译器将“弃用”视为标识符)。

或者也许有一个编译器指令:

{$DEPRECATED ON}
const
  DeprConst1 = 1;
  DeprConst2 = 2;
  DeprConst3 = 3;
{$DEPRECATED OFF}

Embarcadero 的提示指令 documentation 说您可以用提示标记任何声明(如已弃用),但没有详细说明。

【问题讨论】:

  • 在我看来,您可以尝试一下,看看会发生什么,而不是您在此处发布问题并格式化并创建链接所需的时间。你为什么不呢?
  • 他可以尝试一个具体的想法,@Ken,但这并不排除使用 other 语法来实现 Daniel 没有想到的目标。您的回答解决了示例,但并未真正回答 问题
  • @Ken,Daniel 广泛询问如何弃用整个区块。他提出了一个可能的解决方案。您表明该解决方案不起作用,但没有说明是否可以以任何 other 方式弃用块。 Daniel 后来通过添加另一个建议的解决方案来证明这一点。我还能想出几个。我们可以集思广益,您可以整天为我们测试它们,但它仍然无法回答是否可以一开始就这样做的问题(除非我们碰巧猜到了一个可行的方法)。
  • @KenWhite 我将这个问题理解为“有可能...”,但您似乎将其解释为“此代码是否有效...”
  • 我刚刚检查了修订历史,它包含从#1 开始的“Something like:”。对我来说,这意味着 OP 也在寻找替代方案。

标签: delphi delphi-7


【解决方案1】:

正如您所发现的,不能一次性弃用 const 块。也没有您推测的编译器指令。但是,您提到的documentation

当一个提示指令出现在一个单元声明中时,它意味着 提示适用于单元中的所有内容。例如,Windows 3.1 Windows 上的样式 OleAuto.pas 单元已完全弃用。任何 引用该单元或该单元中的任何符号会产生 弃用消息。

通过将已弃用的 const 声明移至新单元并将该单元标记为已弃用,您可以一次性弃用大量声明。然后,当然,您仍然需要修复单元引用。省力与否,由你决定。

【讨论】:

  • 我希望避免移动东西
  • @Daniel 我可以理解,但除了 a) 单独标记,b) 移动到其他单位或 c) Teuns 建议之外似乎没有其他方法,这需要大量编辑。我们说的是几十个还是几百个?
  • 在一个文本文件中使用了大约 1050 个常量(通过 $include),分布在 15 个不同项目中的 110 多个单元中
  • @Daniel 这使您的原始问题与我第一次阅读时的理解完全不同。也许编辑器宏可以为您做单独的标记?
  • @Daniel,FWIW:1050 个常量的编辑不需要花费很长时间。使用一点正则表达式魔法,它应该在几分钟内完成。
【解决方案2】:

这是可能的,但需要一些工作,只需将它们全部标记为已弃用会非常容易得多。

无论如何,你可以这样做:

旧情况

type
  TMyClass = Class
  private  
  public  
    const
      Const1 = 1;
      Const2 = 2;
      Const3 = 3;
  end;

新形势

type
  TDeprecatedClass = Class
  private
  public
    const
      Const1 = 1;
      Const2 = 2;
      Const3 = 3;
  end deprecated;

  TMyClass = Class
  private  
  public  
    const
      Const1 = TDeprecatedClass.Const1;
      Const2 = TDeprecatedClass.Const2;
      Const3 = TDeprecatedClass.Const3;
  end;

每当您使用来自TMyClassTDeprecatedClass 的常量之一时,您都会收到编译器警告。

就像我说的那样,这不是一种非常快速或实用的方法,但它可以完成工作。
现在,是否要一一标记它们是您的选择:)

希望对你有所帮助。

【讨论】:

    【解决方案3】:

    您需要将每个变量分别标记为已弃用。值得一提的是,当 RTL 中不推荐使用货币和日期/时间格式变量时,每个变量都被单独标记。

    来自 Delphi XE RTL 来源:

    var
      CurrencyString: string deprecated 'Use FormatSettings.CurrencyString';
      CurrencyFormat: Byte deprecated 'Use FormatSettings.CurrencyFormat';
      CurrencyDecimals: Byte deprecated 'Use FormatSettings.CurrencyDecimals';
      DateSeparator: Char deprecated 'Use FormatSettings.DateSeparator';
      TimeSeparator: Char deprecated 'Use FormatSettings.TimeSeparator';
      [...]
    

    【讨论】:

      【解决方案4】:

      根据常量的布局方式以及常量中的实际内容,您可以在代码中使用一些技巧。比较简单。突出显示整个常量块,然后打开Replace Text 屏幕。对于Text to Find,添加一个分号;。对于Replace With,输入deprecated;(带有前导空格)。然后选择Replace All。它会简单地将所有分号替换为所需的文本。这是假设您不打算为每个消息添加自定义消息,但如果您有共同消息,则可以将其包含在 Replace With 字段中。

      请注意,这在技术上并不能回答所写的问题,但它确实解决了一次弃用许多常量的根本问题。

      【讨论】:

        猜你喜欢
        • 2011-05-27
        • 2023-04-10
        • 2020-06-30
        • 1970-01-01
        • 2013-06-09
        • 1970-01-01
        • 2023-04-05
        • 2014-08-20
        • 1970-01-01
        相关资源
        最近更新 更多