12
votes

Existe-t-il un moyen d'utiliser C ++ PreProcessor Stringification sur les arguments macro-variadiques?

Je suppose que la réponse à cette question est non, mais ce serait génial s'il y avait un moyen. Pour clarifier, supposons que j'ai la macro suivante:

#define MY_VARIADIC_MACRO(X...) some_variadic_function("some string", #X)


0 commentaires

3 Réponses :


3
votes

Ce n'est probablement pas très proche de ce que vous voulez, mais quelque chose comme ce qui suit pourrait vous obtenir là-bas: xxx

puis utilisez-le comme ce qui suit. Joignez les paramètres de parens de manière à ce qu'il apparaisse comme un paramètre à la macro.

my_varididic_macro ((var1, var2, "string"));

Vous pouvez alors avoir l'appel de macro une fonction qui lâche la parens extérieure ou éventuellement analyser la chaîne donnée.


3 commentaires

C'est presque là-bas, mais l'idée est de soulager la nécessité de joindre la parenthèse ... Darn Return ajoute le commentaire à un rapide, il faut se souvenir de la déclaration de changement de vitesse. Je pense que ce qui précède est très proche d'une solution que je travaille. Je voterai cette réponse puisqu'elle est presque là, mais je ne peux pas la marquer comme la réponse principale puisqu'elle ne satisfait pas pleinement les exigences.


@Zach: J'ai deviné autant. J'aimerais voir comment cela pourrait être fait. Je crois comprendre que cela n'est pas possible, mais j'aimerais être montré différemment.


J'ai posté la réponse ci-dessus que je vais aller avec, assez stoule à ce sujet, résout une grande partie des problèmes que je faisais face.



11
votes

D'accord, je ne voulais pas répondre à ma propre question ici, mais j'ai proposé une solution décente quelque peu une combinaison de la réponse Mark Wilkins et l'exemple que j'ai donné dans la question.

est possible de limiter l'ensemble du jeu de variadic, qui inclut ensuite les virgules de délimitation de la chaîne. Voici un exemple rapide: xxx

Utilisation de la macro ci-dessus montre que l'ensemble des arguments passés à la macro devient strongifié.

alors vous pouvez alors Définissez une fonction pour jetoniser ces arguments à l'aide de la virgule de délimitation, obtenant ainsi l'ensemble des chaînes goûtées à l'aide de la macro variable: xxx

alors il n'y a plus la dépendance d'avoir le Macro variadique Appelez une fonction variable et je peux bien itéralement à travers mon éventail de chaînes C constantes plutôt que d'itération via VA_ARG.

* Nouveautés de Modifier Suit *

Par commentaire de Tim, voici les détails de la solution. S'il vous plaît pardonnez des erreurs depuis que cela a été fait à la hâte et je devais porter de ce que je travaille. En outre, il n'est pas censé être une solution de copie / coller puisqu'il génère uniquement la limitation des arguments pour démontrer POC, mais devrait être suffisamment suffisante pour démontrer la fonctionnalité.

Bien que cette solution nécessite un calcul de temps d'exécution, Les macros variadiques appellent souvent des fonctions variadiques et nécessitent d'itération via VA_ARGS. L'itération a donc lieu dans la recherche des jetons, bien qu'un peu de performance soit probablement sacrifiée. Toutefois, pour la maintenabilité, la polyvalence et la facilité de mise en œuvre, cela semble être la meilleure option pour le moment: xxx


5 commentaires

En outre, une autre caractéristique intéressante est que je peux facilement trouver le nombre d'arguments sans avoir à avoir un type d'informations transmis par la macro afin de déterminer où les arguments de la liste se termine.


Intéressant, mais avant de marquer cela comme une solution, publiez votre code actuel qui résolvait cela. Je suis sûr que cela sera utile pour les autres.


@Tim fera, j'ai déjà testé un cas simple et en fera un exemple plus agréable ... avoir des délais et posteront demain (5/11/2011) ou le lendemain.


@Tim mis à jour avec les détails.


+1. Cela semble une bonne solution. Je n'ai pas réalisé que C99 a appuyé les macros variadiques soutenues. Joli. J'utilise un compilateur Microsoft qui ne le supporte pas (au moins pas dans ce formulaire).



20
votes

Vous pouvez utiliser diverses techniques de macro récursives pour faire des choses avec des macros variadiques. Par exemple, vous pouvez définir un num_args macro qui compte le nombre d'arguments sur une macro variable: xxx

puis avec cela, vous pouvez écrire un pour macro qui élargit une autre macro pour chaque élément d'une liste: xxx

qui vous permettra de définir votre macro qui tire à chacun de ses arguments: < / p> xxx


3 commentaires

Je suis au courant de ces techniques récursives, mais comme on le voit d'en haut, ils sont fastidieux et ils ont également la restriction malheureuse que vous êtes limité au nombre de ARG que vous comptez en compte à la compilation. Je vais mettre à jour ma réponse bientôt avec les détails de cette solution qui n'est pas aussi fastidieuse à mettre en œuvre et n'est pas limité à un Max prédéfini qui est plus facile à maintenir. Ce pourrait être la meilleure solution pour tous les cas, mais pour ce dont j'ai besoin, c'est une meilleure réponse que ci-dessus. Merci pour l'entrée cependant!


Y a-t-il une raison derrière le côlon à la fin du deuxième bloc de code?


C'est une élipité verticale, élimant ainsi les nombreux autres foreach _ macros (éventuellement jusqu'à foreach_100 ) Vous devez autoriser des boucles qui sont grandes.