Можно ли пометить значение перечисления как устаревшее?
e.g.
enum MyEnum {
firstvalue = 0
secondvalue,
thirdvalue, // deprecated
fourthvalue
};
Вторым призовым решением было бы решение ifdef для MSVC и GCC.
Можно ли пометить значение перечисления как устаревшее?
e.g.
enum MyEnum {
firstvalue = 0
secondvalue,
thirdvalue, // deprecated
fourthvalue
};
Вторым призовым решением было бы решение ifdef для MSVC и GCC.
вы можете сделать это:
enum MyEnum {
firstvalue = 0,
secondvalue,
thirdvalue, // deprecated
fourthvalue
};
#pragma deprecated(thirdvalue)
тогда, когда когда-либо будет использоваться переменная, компилятор выведет следующее:
warning C4995: 'thirdvalue': name was marked as #pragma deprecated
EDIT
Это выглядит немного хакерским, и у меня нет компилятора 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
MyEnum test = MyEnum::thirdvalue;
- person Konstantin; 24.05.2018
Вы можете использовать атрибут [[deprecated]] начиная с C++14.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3760.html
enum E { A [[deprecated]] = 3, B };
- person Michał Walenciak; 12.10.2018
Начиная с GCC 6 вы можете просто отказаться от перечислений:
enum {
newval,
oldval __attribute__ ((deprecated ("too old")))
};
Источник: https://gcc.gnu.org/gcc-6/changes.html а>
Вы можете объявить константы перечисления вне объявления перечисления:
enum MyEnum {
firstvalue = 0
secondvalue,
thirdvalue
};
__attribute__ ((deprecated)) const MyEnum fourthvalue = MyEnum(thirdvalue + 1);
MyEnum
, который недостаточно велик для хранения присваиваемого вами значения (thirdvalue + 1
).
- person Tony Delroy; 10.07.2014
Ну, раз мы уже на макро-хаках, то вот мой :-)
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 и не требует нарушения безопасности типов. К сожалению, он по-прежнему злоупотребляет вашим кодом с помощью макросов, так что мда. Но, насколько я мог понять, это настолько хорошо, насколько это возможно.
Предложение, сделанное Томом, намного чище (я полагаю, работает для MSVC), но, к сожалению, единственное сообщение, которое даст вам gcc, - это "игнорирование прагмы".
Использование зависимых от компилятора прагм: Вот документация для Gcc и Visual Studio.
Возможно, вы сможете использовать некоторые макросы.
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());
Это не будет работать в контексте, когда необходима константа.
У меня есть решение (вдохновленное Mark B), в котором используется boost/serialization/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;
}
В GCC я получаю предупреждения, которые в конечном итоге указывают на строки виновника, содержащие thirdvalue
.
Обратите внимание, что использование шаблона Deprecated
приводит к тому, что строка вывода компилятора, созданная здесь, показывает, где используется устаревшее перечисление.
Если вы сможете найти способ переносимого создания предупреждения внутри шаблона Deprecated
, тогда вы сможете избавиться от зависимости от Boost.
_Pragma
, вы действительно можете включить прагму в расширение макроса. Почему вы не публикуете ответ? - person Matthieu M.   schedule 30.03.2011