Maison > développement back-end > C++ > Comment puis-je utiliser en toute sécurité les énumérations comme indicateurs en C ?

Comment puis-je utiliser en toute sécurité les énumérations comme indicateurs en C ?

Susan Sarandon
Libérer: 2025-01-04 09:08:34
original
174 Les gens l'ont consulté

How Can I Safely Use Enums as Flags in C  ?

Surmonter les problèmes de sécurité des types lors du traitement des énumérations comme des indicateurs en C

En C#, l'application de l'attribut [Flags] aux énumérations permet de les traiter comme des indicateurs booléens. Cependant, la réplication de ce comportement en C nécessite une approche différente.

Une méthode consiste à définir des opérateurs au niveau du bit pour l'énumération :

enum AnimalFlags
{
    HasClaws = 1,
    CanFly = 2,
    EatsFish = 4,
    Endangered = 8
};

inline AnimalFlags operator|(AnimalFlags a, AnimalFlags b)
{
    return static_cast<AnimalFlags>(static_cast<int>(a) | static_cast<int>(b));
}
Copier après la connexion

Cela permet des opérations au niveau du bit sur les énumérations, telles que :

seahwk.flags = CanFly | EatsFish | Endangered;
Copier après la connexion

Cependant, des problèmes potentiels de sécurité de type surviennent lors de l'attribution de valeurs non énumérées à la variable enum. Pour résoudre ce problème, considérez ce qui suit :

struct AnimalFlagsGuard
{
    enum : AnimalFlags m_flags;
};

AnimalFlagsGuard seahawk;
seahwak.m_flags = CanFly | EatsFish | Endangered;
Copier après la connexion

En enfermant l'énumération dans une structure, l'attribution de valeurs non énumérées est empêchée au niveau du type. Cette approche maintient la sécurité des types et permet une gestion plus structurée et encapsulée des énumérations en tant que drapeaux.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal