c ++标记枚举值是否已弃用?

moa*_*ala 22 c++ enums deprecated

是否可以将枚举值标记为已弃用?

例如

enum MyEnum {
    firstvalue = 0
    secondvalue,
    thirdvalue, // deprecated
    fourthvalue
};
Run Code Online (Sandbox Code Playgroud)

二等奖解决方案是ifdef MSVC和GCC解决方案.

Tom*_*Tom 14

你可以这样做:

enum MyEnum {
    firstvalue = 0,
    secondvalue,
    thirdvalue, // deprecated
    fourthvalue
};
#pragma deprecated(thirdvalue)
Run Code Online (Sandbox Code Playgroud)

然后,当使用变量时,编译器将输出以下内容:

warning C4995: 'thirdvalue': name was marked as #pragma deprecated
Run Code Online (Sandbox Code Playgroud)

编辑
这看起来有点hacky,我没有GCC编译器来确认(有人可以帮我吗?)但它应该工作:

enum MyEnum {
    firstvalue = 0,
    secondvalue,
#ifdef _MSC_VER
    thirdvalue,
#endif
    fourthvalue = secondvalue + 2
};

#ifdef __GNUC__
__attribute__ ((deprecated)) const MyEnum thirdvalue = MyEnum(secondvalue + 1);
#elif defined _MSC_VER
#pragma deprecated(thirdvalue)
#endif
Run Code Online (Sandbox Code Playgroud)

这是我的答案和MSalters答案的结合


lpa*_*app 6

从 C++14 开始,您可以使用 [[deprecated]] 属性。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3760.html

  • 一个例子看起来像这样:`enum E { A [[deprecated]] = 3, B };` (3认同)

usr*_*567 6

从GCC 6开始,您可以简单地弃用枚举:

enum {
  newval,
  oldval __attribute__ ((deprecated ("too old")))
};
Run Code Online (Sandbox Code Playgroud)

资料来源:https://gcc.gnu.org/gcc-6/changes.html