Je dois faire deux (ou plus) passe sur un (comme une note latérale, je voudrais être en mesure de calculer la longueur de la chaîne formatée en premier et d'allouer suffisamment d'espace, mais la seule fonction que j'ai trouvée pouvant faire cela est _snprintf, et elle est obsolète dans VS2005. ..) p>
Maintenant, jusqu'à présent, il n'y a pas de problèmes: j'utilise Mais j'ai aussi créé une fonction qui prend un Alors, comment feriez-vous cela? P> va_list code>. J'ai un tampon de taille et je veux écrire une chaîne formatée avec Sprintf. Si la chaîne formatée ne correspond pas à l'espace alloué, je veux doubler l'espace alloué et répéter jusqu'à ce qu'il correspond. P>
vsnprintf code> et appelez
va_start code> avant chaque invocation. P>
va_list code> comme paramètre, au lieu de "...". Ensuite, je ne peux pas utiliser
va_start code> à nouveau! J'ai lu sur
va_copy code>, mais il n'est pas pris en charge dans VS2005. P>
4 Réponses :
Je vois d'aucune manière portable (et je pense que VA_Copy a été introduit en C99 car il n'y avait pas de moyen portable d'atteindre son résultat en C89). Une Va_List peut être un type de référence maquette déclarée comme (voir GMP pour un autre utilisateur de cette truc) et explique beaucoup de contraintes de langue autour d'eux. BTW, n'oubliez pas le VA_END si la portabilité est importante. P> Si la portabilité n'est pas importante, je vérifierais stdard.h et voyez si je peux pirater quelque chose en considérant la vraie déclaration. P> < / p>
D'accord. S'il n'y a pas de réponse, c'est aussi une réponse. Merci.
une question précédente sur le manque de VA_COPY Code> dans MSVC a eu des suggestions suffisantes décentes, y compris pour implémenter votre propre version de
VA_COPY CODE> pour une utilisation dans MSVC:
#define va_copy(d,s) ((d) = (s))
Le VA_COPY () est censé faire partie de la spécification C99; Comme pour tout support de paramètre variadique est dépendant très de la plate-forme. Les macros Va_Start, VA_COPY (), VA_Start (), VA_END () sont définis dans STDARG.H .
GCC: Lorsque vous essayez de réutiliser une VA_List sur GCC, il faut utiliser VA_Copy (), car la mise en oeuvre de la GCC provoque la modification de la VA_LIST, ce qui entraîne le positionnement du pointeur après la dernière. paramètre après utilisation par AV ?? Fonction printf () () p>
Sun: Lorsque vous essayez de réutiliser une VA_LIST dans SunStudio (V11, V12), la variable VA_LIST est intacte et peut être réutilisée autant de fois que vous le souhaitez. Besoin de Va_Copy (). P>
MS_VISUAL C: Pas certain, mais on dirait que les documents VC ++ 2010 font mentionner 'VA_Copy ()' et peut impliquer la réutilisation de Va_List est raisonnable, mais doit être testé. P. >
Exemple: p>
en retard pour répondre mais j'espère que quelqu'un trouvera cela utile. Je devais utiliser Va_Copy, mais être indisponible dans VC2005, j'ai cherché et m'a trouvé sur cette page.
J'étais un peu inquiet en utilisant le cœur apparemment brut: p> donc j'ai fait un peu de creuser. Je voulais voir comment Va_Copy a été implémenté dans VC2013, j'ai donc compilé un programme de test qui utilise Va_Copy et le désassemblé: P> Premièrement, son utilisation selon MSDN: P> #if _MSC_VER < 1800 // va_copy is available in vc2013 and onwards
#define va_copy(a,b) (a = b)
#endif