2010-09-12 17 views
11

¿Alguien sabe por qué no hay una función snwprintf en la biblioteca estándar C?¿Por qué C no tiene una función snwprintf?

Soy consciente de swprintf, pero que no tiene la misma semántica de una verdadera versión, wchar_t de snprintf. Por lo que yo puedo decir, no hay una manera fácil de implementar una función de snwprintf usando [v]swprintf:

A diferencia snprintf, swprintf no devuelve el tamaño del búfer necesario; si el buffer proporcionado es insuficiente, simplemente devuelve -1. Esto es indistinguible de la falla debido a errores de codificación, por lo que no puedo volver a intentar con búferes progresivamente más grandes con la esperanza de que finalmente tenga éxito.

Supongo que podría establecer que el último elemento del búfer no sea NUL, llame al swprintf, y suponga que se produjo el truncamiento si ese elemento es NUL después. Sin embargo, ¿está garantizado que funcione? El estándar no especifica en qué estado debe estar el búfer si falla el swprintf. (Por el contrario, snprintf describe qué caracteres se escriben y cuáles se descartan.)

+0

Creo que tiene razón en que no puede asumir nada sobre el contenido del búfer cuando 'swprintf' falla. ¿Podrías usar 'errno'? Sé que funcionaría en POSIX, pero C por sí mismo puede no requerir 'EILSEQ' para codificar errores ...? –

+0

@R ..: Gracias. 'errno' es una idea interesante. Creo que si quiero una solución portátil, tendré que modificar una implementación real de 'vswprintf' de FreeBSD. = ( – jamesdlin

+0

Tenga en cuenta que volver a implementar una función printf-family probablemente sea una mala idea, ya que no puede garantizar que duplique todas las funciones específicas de la configuración regional. –

Respuesta

4

Consulte la respuesta dada por Larry Jones here.

En esencia, se añadió swprintf en C95, mientras que snprintf se añadió en C99 y desde ya muchas implementaciones devuelve el número de caracteres necesarios (por snprintf) y parecía una cosa útil que hacer, que era el comportamiento que fue estandarizada. No pensaron que el comportamiento fuera lo suficientemente importante como para romper la compatibilidad con swprintf al agregarlo (que se agregó sin ese comportamiento varios años antes).

+0

Estoy de acuerdo en que no pudieron romper la compatibilidad retrocediendo 'swprintf', pero podrían haber agregado una nueva función 'snwprintf'. – jamesdlin

+0

Aparentemente no pensaban que valdría la pena agregar otra función solo para implementar este comportamiento. –

+0

En realidad, muchas versiones históricas de' snprintf' anteriores a la estandarización tenían el mismo el comportamiento de "retorno -1" roto como 'swprintf'. El comité lo consideró roto y especificó el comportamiento correcto en su lugar, lo que rompió la compatibilidad con el antiguo estándar Unix (SUSv2) –

Cuestiones relacionadas