/ / Référencement d’un argument spécifique dans une macro variadique - c, macros, arguments, c99, transmission d’arguments

Référencement d'un argument spécifique dans une macro variadique - c, macros, arguments, c99, transmission d'arguments

Il y a quelques questions et réponses sur SEtraiter avec compter le nombre d'arguments réels passés à une macro variadic. Il semble y avoir une solution canonique à ce problème, dont les variantes se répètent dans les réponses.

Ma question est la suivante: est-il possible de faire référence à un argument spécifique de la liste (de manière sûre)? Par exemple, si la macro est définie comme suit:

#define MACRO(...) { some code involving __VA_ARGS__ }

existe-t-il un moyen de renvoyer au 2e argument de la liste (par exemple __VA_ARG_1__), en supposant que nous savons que cela a été passé? Et si nous ne savons pas si cela a été adopté?

Réponses:

3 pour la réponse № 1

Vous pouvez essayer ceci:

#define GET_SECOND(x, y, ...) (y)
#define MACRO(...) { some_code_using(GET_SECOND(__VA_ARGS__)); }

Vous obtiendrez un message d'erreur approprié si vous appelez MACRO avec trop peu d'arguments.


0 pour la réponse № 2

Pour obtenir un argument arbitraire, la réponse très effrayante est contenue ici:

http://p99.gforge.inria.fr/p99-html/p99__list_8h.html

D'après ma compréhension (certes non experte) decomme pour la programmation fonctionnelle et la théorie des langages de programmation, il effectue des récursions et des correspondances dans le préprocesseur, comme dans Haskell, OCaml, etc. résultat.