如何在 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 中将单个枚举值标记为已弃用的主要内容,如果未能解决你的问题,请参考以下文章