10
votes

Pour appeler une fonction variadique avec des arguments non amenés d'une autre fonction variadique

J'ai deux fonction variadic comme foo (format, ...) et bar (format, ...) . Je veux implémenter la fonction foo de sorte qu'elle puisse invoquer bar avec la même liste d'arguments qu'il a. C'est-à-dire, xxx

par exemple, invoquant foo ("(" ("(" (ii) ", 1, 2) invoquera bar avec les mêmes arguments barre ("(ii)", 1, 2) . Comment cette fonction FOO doit-elle être mise en œuvre?

ps: fonction bar est d'une bibliothèque héritée que je ne peux pas changer d'interface.


2 commentaires

Dupliquer de Stackoverflow.com/Questtions/150543/...


Je ne sais pas ce que vous essayez d'accomplir, mais je suis presque disposé à parier que vous trouverez les fonctions de bibliothèque standard suivantes utiles: vprintf () , vfprintf () et vsprintf () .


4 Réponses :


3
votes

Réponse courte - Vous ne pouvez pas. Faire une barre prendre un va_list . Si vous êtes prêt à verrouiller cela vers un compilateur spécifique, vous pouvez probablement le faire avec un assemblage en ligne, mais avec la norme C ou C ++, ce n'est pas possible.

Vous devriez, en règle générale, en mettant toujours en œuvre vos fonctions Vararg en termes de Va_List , puis de créer une fonction Epper ellipsis appelant la fonction réelle va_list fonction.


8 commentaires

Je suis quelque peu en désaccord avec la «réponse courte». Il peut être fait en C ++ 0x avec des modèles variadiques (voir la réponse ailleurs). Je ne fais que parler des balises de questions si - le C ++ en particulier :)


@Max Lybbert: Lequel de ceux de ceux qui seraient C ++ 0x?


@phooji: C ++ 0x n'est pas C ++ (encore) - ne répondra pas à un C ++ - Tagged Q avec C ++ 0x :)


@Erik: aw si peu d'amour pour 0x!


@Erik: Je sais ... mais voulez-vous vraiment que le comité passait du temps sur le nom aussi? :-p


@phooji: Mon commentaire a fait référence à la réponse originale, pas de votre commentaire. Comme dans "si vous êtes prêt à verrouiller cela vers un compilateur spécifique, vous pouvez probablement le faire dans l'assemblage en ligne (ou des extensions spécifiques au compilateur)."


@Max Lybbert: Ah. Je lisais trop dans votre commentaire. Excuses.


J'ai écrit mon commentaire pendant que vous écrivez le vôtre. Si j'avais vu votre commentaire, j'aurais rendu plus clair que je faisais référence à l'OP.



11
votes

ne peut pas être fait, tant que tout ce que vous avez est un groupe si vous avez des fonctions avec des fonctions avec ... code> arguments.

Vous devez planifier à l'avance pour des choses comme ça et implémenter chaque variable fuince Sous la mode à deux étages p> xxx pré>

une fois que chacune de vos fonctions variadiques implémentées via une paire de Va_List * code> fonction et ... Code> Fonction, vous pouvez déléguer les appels à l'aide des versions VA_LIST * CODE> des fonctions P>

void vfoo(format, va_list *args) {
  ...
  vbar(format, args);
  ...
}


0 commentaires

2
votes

Ceci fonctionne en C ++: xxx

sortie: xxx

bien sûr, ceci est C + + 0x spécifique, mais cela fonctionne dans ma version non super récente de GCC. Voir aussi: http://fr.wikipedia.org/wiki/c%2B% 2b0x # variadic_templates

update Ajout de l'exemple de longueur intégral.


0 commentaires

8
votes

GCC peut Construire les appels de fonction à l'exécution .

foo() {
   void *args = __builtin_apply_args();
   void *ret = __builtin_apply(bar, args, ???);
    __builtin_return(ret);
}


0 commentaires