J'ai donc 2 fonctions qui ont toutes deux des arguments similaires
void example(int a, int b, ...);
void exampleB(int b, ...);
Maintenant example
appelle exampleB
, mais comment puis - je transmettre les variables dans la liste d'arguments variable sans modifier exampleB
(comme cela est déjà utilisé ailleurs aussi).
c++
variadic-functions
Indisponible
la source
la source
Réponses:
Vous ne pouvez pas le faire directement; vous devez créer une fonction qui prend un
va_list
:la source
, ...
dans la signature. Si vous avez converti les arguments de variable en ava_list
, vous pouvez passer leva_list
à une autre fonction qui ne prend que ava_list
, mais cette fonction (ou celle qu'elle appelle) doit avoir un moyen de savoir ce qu'il y a dans leva_list
.Peut-être jeter un rocher dans un étang ici, mais cela semble fonctionner assez bien avec les modèles variadiques C ++ 11:
À tout le moins, cela fonctionne avec
g++
.la source
args...
vous devez créer des versions de ces fonctions qui prennent une va_list et les transmettre. Regardez
vprintf
comme un exemple:la source
Je voulais également envelopper printf et j'ai trouvé une réponse utile ici:
Comment passer un nombre variable d'arguments à printf / sprintf
Je n'étais pas du tout intéressé par les performances (je suis sûr que ce morceau de code peut être amélioré de plusieurs façons, n'hésitez pas à le faire :)), c'est pour le débogage général uniquement, j'ai donc fait ceci:
que je peux ensuite utiliser comme ça
Les ostreams c ++ sont beaux à certains égards, mais ils deviennent pratiquement horribles si vous voulez imprimer quelque chose comme ça avec quelques petites chaînes telles que des parenthèses, des deux points et des virgules insérés entre les nombres.
la source
Incidemment, de nombreuses implémentations C ont une variation interne v? Printf dont IMHO aurait dû faire partie de la norme C. Les détails exacts varient, mais une implémentation typique acceptera une structure contenant un pointeur de fonction de sortie de caractère et des informations indiquant ce qui est censé se produire. Cela permet à printf, sprintf et fprintf d'utiliser tous le même mécanisme «principal». Par exemple, vsprintf pourrait être quelque chose comme:
La fonction core_printf appelle ensuite p_inf-> func pour chaque caractère à afficher; la fonction de sortie peut alors envoyer les caractères à la console, un fichier, une chaîne ou autre chose. Si une implémentation expose la fonction core_printf (et quel que soit le mécanisme de configuration qu'elle utilise), on peut l'étendre avec toutes sortes de variations.
la source
Une manière possible est d'utiliser #define:
la source
Sur la base du commentaire que vous encapsulez
vsprintf
et que cela est étiqueté comme C ++, je suggérerais de ne pas essayer de le faire, mais de modifier votre interface pour utiliser les iostreams C ++ à la place. Ils présentent des avantages par rapport auprint
gamme de fonctions, telles que la sécurité des caractères et la possibilité d'imprimer des éléments quiprintf
ne pourraient pas être manipulés. Certaines retouches maintenant pourraient éviter une quantité importante de douleur à l'avenir.la source
En utilisant le nouveau standard C ++ 0x, vous pourrez peut-être le faire en utilisant des modèles variadiques ou même convertir cet ancien code en la nouvelle syntaxe de modèle sans rien casser.
la source
C'est la seule façon de le faire .. et la meilleure façon de le faire aussi ..
la source