Maison > développement back-end > C++ > Pouvons-nous émettre des avertissements au moment de la compilation comme « static_assert » en C ?

Pouvons-nous émettre des avertissements au moment de la compilation comme « static_assert » en C ?

Linda Hamilton
Libérer: 2024-11-02 18:47:02
original
454 Les gens l'ont consulté

Can We Emit Compile-Time Warnings Like `static_assert` in C  ?

Puis-je implémenter un « avertissement statique » pour émettre des avertissements au moment de la compilation ?

Static_assert en C 11 est un outil précieux pour identifier les erreurs au moment de la compilation. Cependant, cela génère uniquement des erreurs de compilation, pas d’avertissements. Cette question explore la possibilité d'implémenter un "static_warning" qui émet des avertissements au lieu d'abandonner la compilation.

Implémentation possible à l'aide de macros

S'inspirant du commentaire de Michael E, un La solution est proposée à l'aide de macros :

<code class="cpp">#define DEPRECATE(foo, msg) foo __attribute__((deprecated(msg)))  // GCC
#define DEPRECATE(foo, msg) __declspec(deprecated(msg)) foo  // MSVC</code>
Copier après la connexion

Des macros supplémentaires sont introduites pour faciliter la création d'avertissements statiques :

<code class="cpp">#define STATIC_WARNING(cond, msg) ...
#define STATIC_WARNING_TEMPLATE(token, cond, msg) ...</code>
Copier après la connexion

Exemples d'utilisation

Les macros peuvent être utilisées à différentes portées :

<code class="cpp">STATIC_WARNING(1==2, "Failed with 1 and 2");
STATIC_WARNING(..., "2 and 3 worked");

struct Foo {
  STATIC_WARNING(..., "2 and 3: oops");
};

void func() {
  STATIC_WARNING(..., "Not so good on 3 and 4");
}

template <typename T> struct wrap {
  STATIC_WARNING_TEMPLATE(WRAP_WARNING1, ..., "A template warning");
};</code>
Copier après la connexion

Sortie dans différents compilateurs

La compilation de l'exemple de code avec différents compilateurs génère des avertissements comme prévu :

  • GCC 4.6 :

    warning: ‘void static_warning1::_(const detail::false_type&)’ is deprecated ...
    Copier après la connexion
  • Visual C 2010 :

    warning C4996: 'static_warning1::_': Failed with 1 and 2
    Copier après la connexion
  • Clang 3.1 :

    warning: '_' is deprecated: Failed with 1 and 2 ...
    Copier après la connexion

Conclusion

Les macros présentées offrent un approche pour implémenter une fonctionnalité static_warning qui émet des avertissements plutôt que de provoquer des erreurs de compilation. C'est un outil utile pour déboguer et tracer des spécialisations de modèles complexes lors de la compilation.

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