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>
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>
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>
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 ...
Visual C 2010 :
warning C4996: 'static_warning1::_': Failed with 1 and 2
Clang 3.1 :
warning: '_' is deprecated: Failed with 1 and 2 ...
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!