J'ai deux fonction variadic comme par exemple, invoquant ps: fonction foo (format, ...) code> et
bar (format, ...) code>. Je veux implémenter la fonction
foo code> de sorte qu'elle puisse invoquer
bar code> avec la même liste d'arguments qu'il a. C'est-à-dire,
foo ("(" ("(" (ii) ", 1, 2) code> invoquera
bar code> avec les mêmes arguments
barre ("(ii)", 1, 2) code>. Comment cette fonction
FOO code> doit-elle être mise en œuvre? p>
bar code> est d'une bibliothèque héritée que je ne peux pas changer d'interface. P> P>
4 Réponses :
Réponse courte - Vous ne pouvez pas. Faire une barre prendre un Vous devriez, en règle générale, en mettant toujours en œuvre vos fonctions Vararg en termes de va_list code>. 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. p>
Va_List CODE>, puis de créer une fonction Epper ellipsis appelant la fonction réelle
va_list code> fonction. P >
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.
ne peut pas être fait, tant que tout ce que vous avez est un groupe si vous avez des fonctions avec des fonctions avec Vous devez planifier à l'avance pour des choses comme ça et implémenter chaque variable fuince Sous la mode à deux étages p> une fois que chacune de vos fonctions variadiques implémentées via une paire de ... code> arguments.
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);
...
}
Ceci fonctionne en C ++: 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 p> update strong> Ajout de l'exemple de longueur intégral. P> p>
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); }
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 () code>,
vfprintf () code> et
vsprintf () code>.