能否将整个const块标记为已弃用?

12

我知道你可以使用下面的方法将单个常量标记为弃用

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

但是,你能否将整个const块标记为已弃用,而无需逐个标记常量呢?

我想要做类似以下的事情:

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

然而,这段代码无法编译通过(编译器将“deprecated”视为标识符)。

或者也许有编译器指令:

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

Embarcadero的提示指令文档称您可以使用提示(例如过时)标记任何声明,但未详细说明。


2
在我看来,你可以尝试一下这个方法,比起你发帖、格式化和创建链接所花费的时间更短,为什么不试一下呢? - Ken White
5
@Ken,他可以尝试那个具体的想法,但这并不排除其他语法实现达成Daniel没有想到的目标。你的回答解决了示例,但并没有真正回答问题。 - Rob Kennedy
6
@Ken,Daniel 广泛地询问如何废弃整个代码块。他提出了一种 可能的 解决方案。你展示了这个解决方案不起作用,但没有说是否有其他方式可以废弃一个代码块。后来,Daniel 通过添加另一个建议的解决方案进行了演示。我能想到几个更多的方法。我们可以集思广益语法,并且你可以为我们测试它们整天,但这仍然无法回答首先是否可以实现的问题(除非我们碰巧猜到一个可行的方案)。 - Rob Kennedy
4
@KenWhite,我理解这个问题是“是否可能...”,但你似乎把它解释为“这段代码会工作吗...” - Jerry Dodge
5
我刚刚查看了修订历史记录,发现从#1开始有“类似于:”的内容。对我来说,这意味着原帖作者也在寻找替代方案。 - Uli Gerhardt
显示剩余11条评论
4个回答

13
正如你所发现的那样,一个常量块无法一次性废弃。并且,像你猜测的那样,也没有编译器指令。然而,你所参考的文档表示:

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

通过将不推荐使用的 const 声明移动到一个新单元并将该单元标记为不推荐使用,您可以一次性废弃更多的声明。然后,当然,您仍需要修复单元引用。节省的努力与否由您决定。


我希望避免移动东西。 - Daniel Santos
1
@Daniel 我能理解,但似乎除了a)逐个标记、b)移动到其他单元或c)Teuns的建议(需要大量编辑)之外,没有其他方法了。我们是在谈论几十个项目还是几百个? - Tom Brunberg
一个文本文件中有大约1050个常量,通过$include在15个不同项目中的110多个单元中使用。 - Daniel Santos
@Daniel 这使得我最初阅读时所理解的你的原问题完全不同。也许编辑器宏可以为您进行单独标记? - Tom Brunberg
1
@Daniel,顺便说一下:编辑1050个常量不需要花费很长时间。使用一些正则表达式技巧,几分钟就可以完成。 - Uli Gerhardt
显示剩余2条评论

3

这是可能的,但需要一些工作,简单地将它们全部标记为过时的会更容易。

无论如何,以下是您可以执行的操作:

旧情况

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';
  [...]

1
根据常量的布局方式和实际内容,您可以在代码中使用一个技巧。这很简单。选择整个常量块,并打开“替换文本”屏幕。对于“要查找的文本”,输入分号;。对于“替换为”,输入deprecated;(带有前导空格)。然后选择“全部替换”。它将简单地用所需的文本替换所有分号。这是假设您不打算为每个常量放置自定义消息,但如果您有一个公共消息,可以将其包含在“替换为”字段中。
请注意,这并不严格回答所提出的问题,但它确实解决了一次性废弃多个常量的基本问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接