是否可以将枚举值标记为已弃用?C++将枚举值标记为已弃用?
例如
enum MyEnum {
firstvalue = 0
secondvalue,
thirdvalue, // deprecated
fourthvalue
};
二等奖解决方案是ifdef MSVC和GCC解决方案。
是否可以将枚举值标记为已弃用?C++将枚举值标记为已弃用?
例如
enum MyEnum {
firstvalue = 0
secondvalue,
thirdvalue, // deprecated
fourthvalue
};
二等奖解决方案是ifdef MSVC和GCC解决方案。
使用编译器相关编译指示:以下是Gcc和Visual Studio的文档。
你可能可以使用一些宏hackery。
enum MyEnum {
firstvalue = 0
secondvalue,
real_thirdvalue, // deprecated
fourthvalue
};
template <MyEnum v>
struct real_value
{
static MyEnum value()
{
1 != 2U; // Cause a warning in for example g++. Leave a comment behind for the user to translate this warning into "thirdvalue is deprecated"
return v;
}
};
#define thirdvalue (real_value<real_thirdvalue>::value());
当需要一个常数时,这在上下文中不起作用。曾经使用的变量时
enum MyEnum {
firstvalue = 0,
secondvalue,
thirdvalue, // deprecated
fourthvalue
};
#pragma deprecated(thirdvalue)
然后,编译器将输出如下:
我不知道这是否有效,但为纯粹血腥头脑的hackery +1。 ;-) – 2011-03-30 15:42:40
你为什么要这样疯狂? – lpapp 2013-11-29 06:00:48
你能做到这一点
warning C4995: 'thirdvalue': name was marked as #pragma deprecated
编辑
这看起来有点哈克和我没有一个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
这是我的答案和MSalters的回答
井的组合,因为我们在宏观黑客已经,这里是我的:-)
enum MyEnum
{
foo,
bar,
baz
};
typedef __attribute__ ((deprecated))MyEnum MyEnum_deprecated;
#define bar ((MyEnum_deprecated) bar)
int main()
{
int a = foo; // yuck, why did C++ ever allow that...
int b = bar;
MyEnum c = foo;
MyEnum d = bar;
return 0;
}
这个工程用gcc,它也不要求你打破型号安全。不幸的是它仍然用宏来滥用你的代码,所以。但据我所知,这是一样好。
Tom提出的建议更清洁(我认为适用于MSVC),但不幸的是gcc会给你的唯一信息是“忽略编译指示”。
可以enum声明外声明枚举常量:
enum MyEnum {
firstvalue = 0
secondvalue,
thirdvalue
};
__attribute__ ((deprecated)) const MyEnum fourthvalue = MyEnum(thirdvalue + 1);
虽然这不适用于msvc,也不适用于C++ 11类枚举。 – lpapp 2013-11-29 06:07:04
如果编译器为MyEnum选择了一个不足以容纳您赋值的值('thirdvalue + 1'),它也会中断。 – 2014-07-10 08:54:53
我有一个解决方案(马克B的启发),使得使用升压/系列化/ static_warning.hpp的。但是,我允许thirdvalue
用作符号常量。它还会为有人试图使用thirdvalue
的每个地方发出警告。
#include <boost/serialization/static_warning.hpp>
enum MyEnum {
firstvalue = 0,
secondvalue,
deprecated_thirdvalue, // deprecated
fourthvalue
};
template <int line>
struct Deprecated
{
BOOST_SERIALIZATION_BSW(false, line);
enum {MyEnum_thirdvalue = deprecated_thirdvalue};
};
#define thirdvalue (static_cast<MyEnum>(Deprecated<__LINE__>::MyEnum_thirdvalue))
enum {symbolic_constant = thirdvalue};
int main()
{
MyEnum e = thirdvalue;
}
海合会我得到的最终指向包含thirdvalue
罪魁祸首线警告。
请注意,使用Deprecated
模板可以使“实例化到此处”的编译器输出行显示废弃枚举的使用位置。
如果您可以找出在Deprecated
模板中可移植生成警告的方法,那么您可以取消对Boost的依赖关系。
您可以使用C++ 14中的[[deprecated]]属性。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3760.html
与海湾合作委员会6,你可以简单地弃用枚举开始:
enum {
newval,
oldval __attribute__ ((deprecated ("too old")))
};
你有什么要发生?只需重新命名它,编译器将发出错误... – Lindydancer 2011-03-30 15:00:26
@Lindydancer:但是这不仅仅是贬抑,不是吗?我认为重点在于允许现有代码进行编译,但发出有关已弃用资源的警告。 – 2011-03-30 15:07:53
@Lindydancer:它已经足够了,不需要对类,函数,类型进行弃用... – moala 2011-03-30 15:08:31