如何在 Delphi 中将单个枚举值标记为已弃用

Posted

技术标签:

【中文标题】如何在 Delphi 中将单个枚举值标记为已弃用【英文标题】:How to mark as deprecated a single enum value in Delphi 【发布时间】:2012-03-14 10:30:30 【问题描述】:

我希望拥有以下内容:

TEnumType = (
  etValue1 = 1,
  etValue2 = 2 deprecated,
  etValue3 = 3);

返回:

[DCC Error] unt_CollectionImportType.pas(19): E2029 ',' or ')' expected 
but identifier 'deprecated' found.

有没有办法指示编译器该值已被弃用。

【问题讨论】:

我认为这是不可能的,一种方法是使用 $MESSAGE WARN 'TEnumType.etValue2 is deprecated' 让用户知道它已被弃用... @dorin 那不好。这只会在您每次编译时而不是在您使用符号时创建一个警告。 @David 毕竟没那么简单。 :) @DorinDuminica,这太粗糙了,甚至无法与该指令提供的功能相提并论。无论如何,如果有任何人会创建一个 QC 条目 - 它会得到我的投票。 @craig 你的回答很聪明,但它仍然是一种解决方法。 【参考方案1】:
type
  TEnumType = (
    etValue1 = 1,
    etDeprecated2 = 2, // was: etValue2; Renamed so we can deprecate it by name
    etValue3 = 3);

const
   etValue2 = etDeprecated2 deprecated; // Declares a constant mapped to the renamed enum value.

【讨论】:

@Rudy - 是的,但这就是目标。将实际的枚举值替换为不会使用的名称,然后将现有(已弃用的)枚举值声明为新名称的“别名”,并将 alias 标记为已弃用。现有代码使用旧名称(别名),因此编译器会通过警告报告使用不推荐使用的值名称。这个答案完美地解决了这个问题,而且非常巧妙地恕我直言。 话虽如此,我会说如果不再使用该值,那么只需删除它或更改它的名称就足够了。然后,您会得到编译器错误,而不是编译器警告,除非并且直到您消除了所有已弃用符号的使用(这肯定是最终目标)。 +1,非常好。这种答案让我觉得我应该问更多问题 @Deltics:只有在示例中给出值的情况下才能做到这一点。当您依赖隐式枚举编号(即TEnumType = (etZero, etOne, Two))时,您不能/不应该从列表中删除一个值,尤其是当您将相应的数值存储在其他地方时。重命名是唯一的选择。我同意不需要别名,但它确实提供了有用的警告,而不仅仅是关于未声明标识符的错误消息。 +1 尽管有警告:这将中断已弃用值的 DFM 流,因为 DFM 流将查看值的枚举类型,而不是 const。因此,当您有一个包含值 etValue2 的现有 DFM 文件时,它会在读取该 DFM 文件时崩溃。

以上是关于如何在 Delphi 中将单个枚举值标记为已弃用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 RAML 中将 REST 服务标记为已弃用

是否可以在打字稿中将某些内容标记为已弃用?

将 PLSQL 过程/函数标记为已弃用

将 pybind11 绑定标记为已弃用的最佳方法

重命名python子包,将旧名称标记为已弃用

代码分析/FxCop CA1726:UsePreferredTerms 显示已取消为已弃用