28 votes

c++ marquer une valeur d'enum comme dépréciée ?

Est-il possible de marquer une valeur d'enum comme étant dépréciée ?

par exemple

enum MyEnum {
    firstvalue = 0
    secondvalue,
    thirdvalue, // deprecated
    fourthvalue
};

Une solution de second prix serait d'ifdef une solution MSVC et une solution GCC.

14voto

James Points 543

Vous pourriez faire ça :

enum MyEnum {
    firstvalue = 0,
    secondvalue,
    thirdvalue, // deprecated
    fourthvalue
};
#pragma deprecated(thirdvalue)

alors, à chaque fois que la variable sera utilisée, le compilateur produira le résultat suivant :

warning C4995: 'thirdvalue': name was marked as #pragma deprecated

EDITAR
Cela semble un peu compliqué et je n'ai pas de compilateur GCC pour le confirmer (quelqu'un pourrait-il le faire pour moi ?) mais cela devrait fonctionner :

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

c'est une combinaison de ma réponse et de celle de MSalters

11voto

lpapp Points 22857

Vous pouvez utiliser l'attribut [[obsolète]] à partir de C++14.

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

7voto

usr1234567 Points 9086

À partir de GCC 6, vous pouvez simplement déprécier les enums :

enum {
  newval,
  oldval __attribute__ ((deprecated ("too old")))
};

Fuente: https://gcc.gnu.org/gcc-6/changes.html

3voto

Damon Points 26437

Puisque nous en sommes déjà aux macro-hacks, voici le mien :-)

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;
}

Cela fonctionne avec gcc, et il n'est pas nécessaire de rompre la sécurité des types. Malheureusement, il abuse toujours de votre code avec des macros, donc meh. Mais d'après ce que j'ai pu comprendre, c'est aussi bon que possible.

La proposition faite par Tom est beaucoup plus propre (fonctionne pour MSVC, je suppose), mais malheureusement le seul message que gcc vous donnera est "ignoring pragma".

3voto

MSalters Points 74024

Vous pouvez déclarer des constantes d'enum en dehors d'une déclaration d'enum :

enum MyEnum {
    firstvalue = 0
    secondvalue,
    thirdvalue
};
__attribute__ ((deprecated)) const MyEnum fourthvalue = MyEnum(thirdvalue + 1);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X