Maison >développement back-end >C++ >Pourquoi MSVC traite-t-il VA_ARGS comme un argument unique dans l'expansion de macros variadiques, et comment cela peut-il être contourné ?

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
Patricia Arquetteoriginal
2024-11-05 14:29:02627parcourir

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>

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>

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!

Déclaration:
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