8
votes

En utilisant des virgules à l'intérieur d'une macro sans parenthèse: comment puis-je mélanger et faire correspondre avec un modèle?

considérer une macro simple: xxx pré>

ceci produit la sortie exacte que nous attendons: p> xxx pré>

L'exemple ci-dessus fonctionne car la parenthèse adjacente à l'appel de la fonction sont reconnus par le préprocesseur. P>

considère maintenant ce qui se passe si j'utilise un modèle au lieu d'un appel de fonction: p>

ECHO(template<int, bool>)


3 commentaires

Dupliqué possible de C ++ Problème macro (interprétation de la virgule,)


@Olicharlesworth Ah, je n'ai pas trouvé celui-ci dans ma recherche. La réponse ne semble pas répondre à mon problème exact, bien qu'il fournisse de la nourriture à la pensée. Merci.


Une question plus récente a de nouvelles réponses: Stackoverflow.com/ Questions / 13842468 / Comma-in-CC-Macro / ...


3 Réponses :


11
votes
ECHO((a, b))

1 commentaires

Notez que vous avez boost_pp_comma si vous pouvez inclure "boost / préprocesseur / ponctuation / virult.hpp" . boost.org/doc/libs/1_31_0/ libs / préprocesseur / doc / ref / virt.ht ml



1
votes

Si vous autorisez l'utilisation de Cog dans votre projet, votre code devient plus lisible:

/*[[[cog
# definitions ----
import declarations
# generation ---
types = ['bool' , 'std::string']
names = ['Foo' , 'Bar']
for index in range(len(names)):
    AddDeclaration( 'template<int, %s>' % types[index] , names[index])
]]]*/
template<int, bool> struct Foo;
template<int, std::string> struct Bar;
//[[[end]]]


0 commentaires

5
votes

Une macro variable peut aider:

#define ECHO(x...) x

ECHO(foo(1, 2))
ECHO(template<int, bool>)


1 commentaires

Notez que cela utilise une extension GNU. La voie standard (C ++ 11) serait #define echo (...) __va_args __ .