¿Cuál es la mejor manera de encontrar los dolores de cabeza de cuerdas anchas tales como L “% s”?
-
16-09-2019 - |
Pregunta
Este es un ejemplo de uno de los dolores de cabeza que quiero decir:
Tenemos un proyecto multiplataforma que utiliza cadenas Unicode para la mayoría de la representación de texto a la pantalla. En las ventanas de VC ++ la línea:
swprintf(swWideDest, LEN, L"%s is a wide string", swSomeWideString);
compila bien e imprime la gran cadena en la otra cadena de ancho. Sin embargo, esta realidad debería ser:
swprintf(swWideDest, LEN, L"%ls is a wide string", swSomeWideString);
sin sustituir el '% s' con un '% ls' esto no funcionará en otras plataformas. Como prueba de nuestro entorno en Windows es más fácil, más rápido, y mucho más fácil de depurar. Este tipo de errores puede fácilmente pasar desapercibido.
Yo sé que la mejor solución es escribir código correcto en el primer lugar, pero bajo la presión se cometen errores simples, y en este caso particular, el error puede fácilmente pasar desapercibida durante mucho tiempo.
Sospecho que hay muchas variaciones en este tipo de error, que todavía tenemos que disfrutar.
¿Alguien tiene una forma agradable y limpio de encontrar este tipo de errores?
: D
Solución
Como ninguna de las funciones de la familia *printf
son typesafe que o bien
- búsqueda de errores probables a través de expresiones regulares y corregirlos manualmente
- utilizar otro enfoque que es typesafe, tal vez basado en stringstreams o boost.format
Otros consejos
Es posible que desee echar un vistazo a FastFormat en caso de Boost.Format es demasiado lento para sus necesidades .
En comparación con stringstreams y Boost.Format:
- iostreams: FastFormat.Format es más rápido que iostreams, entre un ~ 100-900%, en todos los casos
- Boost.Format: FastFormat.Format es más rápido que Boost.Format, entre un ~ 400-1650%, en todos los casos