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

18

我希望有以下内容:

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

它返回:

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

有没有一种方法可以告诉编译器这个值已经过时了。


1
我认为这是不可能的,一种方法是使用{$MESSAGE WARN 'TEnumType.etValue2已被弃用'}来让用户知道它已经被弃用了... - user497849
4
@dorin 这样做不好。这只会在编译时而不是使用符号时创建警告。 - David Heffernan
@David 其实并不那么简单。 :) - Zoë Peterson
@DorinDuminica,那太粗糙了,甚至无法与此指令提供的功能相比。不管怎样,如果有任何同伴创建了一个QC条目 - 我会支持的。 - OnTheFly
@craig,你的答案很聪明,但仍然有点绕弯子。 - David Heffernan
显示剩余2条评论
1个回答

36
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.

7
@Rudy - 是的,但这就是目的。用一个不会使用的名称替换实际的枚举值,然后将现有(已弃用)枚举值声明为新名称的“别名”,并将该别名标记为已弃用。现有代码正在使用旧名称(即别名),因此编译器通过警告报告使用已弃用的值名称。在我看来,这个答案完美地解决了问题,而且相当聪明。 - Deltics
4
话虽如此,如果这个值不应再使用,那么只需将其删除或更改名称即可。然后,除非您消除了对已弃用符号的所有使用(这肯定是最终目标),否则您将获得编译器错误而不是编译器警告。 - Deltics
7
+1,非常好。这是那种让我觉得应该提出更多问题的答案类型。 - Cosmin Prund
2
@Deltics:只有在值像示例中一样给出时才能这样做。当您依赖隐式枚举编号(即TEnumType = (etZero, etOne, Two))时,您不能/不应该从列表中删除一个值,尤其是当您在其他地方存储相应的数字值时。那时候只有重命名是唯一的选择。我同意别名不是必需的,但它确实提供了有用的警告,而不仅仅是关于标识符未被声明的错误消息。 - Marjan Venema
4
+1,但需要注意警告:这会破坏已弃用值的DFM流式传输,因为DFM流式传输将查找枚举类型中的值,而不是const。因此,如果您有包含值“etValue2”的现有DFM文件,则在读取该DFM文件时会崩溃。 - Jeroen Wiert Pluimers
显示剩余5条评论

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