Maison > développement back-end > C++ > le corps du texte

Pourquoi MSVC traite-t-il VA_ARGS comme un argument unique dans l'expansion de macros variadiques, et comment cela peut-il être contourné ?

Patricia Arquette
Libérer: 2024-11-05 14:29:02
original
568 Les gens l'ont consulté

Why does MSVC   treat VA_ARGS as a single argument in variadic macro expansion, and how can this be worked around?

Extension de macros variadiques dans MSVC

Dans le monde de la programmation C, les macros offrent un moyen pratique de définir des extraits de code réutilisables. Cependant, lors de l'exploration de macros variadiques dans le compilateur Visual C (MSVC) de Microsoft, une pierre d'achoppement peut survenir. Cet article se penche sur le problème soulevé par un développeur et présente une solution de contournement pour permettre une expansion de macro variadique similaire à celle trouvée dans GCC.

Énoncé du problème

Le problème en question implique une macro qui se développe parfaitement dans GCC mais rencontre des difficultés dans MSVC . Plus précisément, la macro en question fonctionne mal en traitant tous les VA_ARGS (arguments de variable) comme un seul argument. Vous trouverez ci-dessous un extrait du code du problème :

<code class="cpp">#define VA_NARGS_IMPL(__1, __2, __3, __4, __5, N, ...) N
#define VA_NARGS(...) VA_NARGS_IMPL(__VA_ARGS__, 5, 4, 3, 2, 1)</code>
Copier après la connexion

Cette macro est conçue pour compter le nombre d'arguments qui lui sont transmis. Cependant, MSVC interprète par erreur tous les VA_ARGS comme un seul argument, ce qui entraîne un décompte incorrect.

Solution de contournement

Alors que l'enquêteur cherchait une technique pour reproduire le comportement souhaité de GCC dans MSVC , une solution brillante a été proposée par Jeff Walden dans le fil source. Cette solution de contournement nécessite la déclaration d'une macro d'assistance pour chaque macro variadique, comme indiqué ci-dessous :

<code class="cpp">#define FOO_CHOOSE_HELPER1(macro, count, ...) macro##count(__VA_ARGS__)
#define FOO_CHOOSE_HELPER2(macro, count, ...) FOO_CHOOSE_HELPER1(macro, count)
#define FOO(...) FOO_CHOOSE_HELPER2(FOO, COUNT_ARGS(__VA_ARGS__), __VA_ARGS__)</code>
Copier après la connexion

La macro COUNT_ARGS est utilisée pour déterminer le nombre d'arguments passés à la macro variadique FOO, et les macros d'assistance FOO_CHOOSE_HELPER1 et FOO_CHOOSE_HELPER2 sélectionnent la surcharge appropriée de FOO en fonction de l'argument count.

Conclusion

Bien que la solution de contournement résolve efficacement le problème d'expansion des macros variadiques dans MSVC, elle nécessite la déclaration d'une macro d'assistance pour chaque macro variadique, qui peut devenir encombrant pour les grandes bases de code. Néanmoins, il constitue une solution viable pour ceux qui rencontrent des défis similaires dans leurs projets MSVC.

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!