2010-09-12 2 views
11

Est-ce que quelqu'un sait pourquoi il n'y a pas de fonction snwprintf dans la bibliothèque standard C?Pourquoi C n'a pas de fonction snwprintf?

Je suis au courant de swprintf, mais cela n'a pas la même sémantique d'une vraie, wchar_t version de snprintf. Pour autant que je peux dire, il n'y a aucun moyen facile à mettre en œuvre une fonction snwprintf utilisant [v]swprintf:

Contrairement snprintf, swprintf ne retourne pas la taille de la mémoire tampon nécessaire; Si le tampon fourni est insuffisant, il renvoie simplement -1. Ceci est indiscernable de l'échec dû aux erreurs d'encodage, donc je ne peux pas continuer à essayer avec des tampons progressivement plus grands en espérant qu'il finira par réussir.

Je suppose que je pourrais définir le dernier élément de la mémoire tampon comme non-NUL, appelez swprintf, et supposons que la troncature s'est produite si cet élément est NUL par la suite. Cependant, est-ce garanti au travail? La norme ne spécifie pas l'état dans lequel le tampon doit être si swprintf échoue. (En revanche, snprintf décrit quels caractères sont écrits et lesquels sont supprimés.)

+0

Je pense que vous avez raison de dire que vous ne pouvez rien supposer du contenu de la mémoire tampon quand 'swprintf' échoue. Pourriez-vous utiliser 'errno'? Je sais que cela fonctionnerait sur POSIX mais C en lui-même ne peut pas exiger 'EILSEQ' pour les erreurs de codage ...? –

+0

@R ..: Merci. 'errno' est une idée intéressante. Je pense que si je veux une solution portable, je devrais peut-être modifier une implémentation 'vswprintf' de FreeBSD. = ( – jamesdlin

+0

Rappelez-vous, réimplémenter une fonction printf-family est probablement une mauvaise idée, car vous ne pouvez pas garantir que vous dupliquerez toutes les fonctionnalités spécifiques à la locale –

Répondre

4

Voir la réponse fournie par Larry Jones here.

Essentiellement, swprintf a été ajouté à C95 en snprintf a été ajouté en C99 et depuis de nombreuses implémentations déjà retourné le nombre de caractères requis (pour snprintf) et il semblait une chose utile à faire, c'était le comportement qui a été normalisé. Ils ne pensaient pas que le comportement était suffisamment important pour rompre la compatibilité avec swprintf en l'ajoutant (qui a été ajouté sans ce comportement plusieurs années auparavant).

+0

Je suis d'accord qu'ils ne pouvaient pas casser la compatibilité ascendante en changeant 'swprintf', mais ils auraient pu ajouter une nouvelle fonction 'snwprintf' – jamesdlin

+0

Apparemment, ils ne pensaient pas que cela valait la peine d'ajouter une autre fonction juste pour implémenter ce comportement: –

+0

En fait, de nombreuses versions historiques de' snprintf' avant la standardisation avaient le même comportement. Le comportement "return-1" de "swprintf" est cassé, le comité le considère comme cassé et spécifie le comportement correct, ce qui rompt la compatibilité avec l'ancien standard Unix (SUSv2) –

Questions connexes