Históricamente, MinGW ha estado en una situación extraña, especialmente en lo que respecta al soporte C99. MinGW se basa principalmente en el tiempo de ejecución msvcrt.dll que se distribuye con Windows, y ese tiempo de ejecución no es compatible con C99.
De modo que con las versiones anteriores de MinGW, puede tener problemas en el modo C99 al usar especificadores de formato específicos de C99. También históricamente, GCC no hizo ningún ajuste especial para la falta de soporte de msvcrt.dll para los especificadores C99. De modo que entraría en situaciones en las que -Wformat
no advertiría acerca de un formato que no funcionaría.
cosas están mejorando en ambos lados - GCC tiene soporte específico para -Wformat cuando se utiliza con el tiempo de ejecución de MS, tales como:
-Wpedantic-ms-format
tanto GCC no se quejará de "I32"
y "I64"
(aunque es documentada, sigo teniendo una queja acerca de que sea reconocido incluso en 4.7.0 - tal vez es nuevo)
- la opción
ms_printf
a __attribute__((__format__))
por Por otro lado, MinGW ha proporcionado su propio snprintf()
por un tiempo, ya que la variante de MSVC, _snprintf()
, se comporta de manera bastante diferente. Sin embargo, MinGW se basó durante mucho tiempo en el printf()
en msvcrt.dll, por lo que los especificadores de formato C99 para printf()
no funcionaron. En algún momento, MinGW comenzó a proporcionar su propia versión de printf()
y amigos para que pueda obtener compatibilidad adecuada con C99 (y GNU?). Sin embargo, parece que para ser conservadores, estos no reemplazaron las versiones de msvcrt.dll inicialmente. Tienen nombres como __mingw_printf()
.
Parece que en algún punto entre 4.6.1 y 4.7.0, los encabezados MinGW comenzaron a utilizar las versiones suministradas MinGW como reemplazos para la función msvcrt.dll (al menos si ha especificado C99).
Sin embargo, parece que con las versiones más nuevas, GCC y MinGW aún están un poco fuera de sincronización. Mientras que antes GCC no advertía acerca de los especificadores que en realidad no funcionarían en MinGW, no se queja de los spcifiers que lo harán.
es posible que desee probar el siguiente snipet de código para ver qué tan bien su versión de MinGW apoyo "hhX"
:
printf("%hhX\n", 0x11223344);
__mingw_printf("%hhX\n", 0x11223344);
No estoy seguro de qué sugerir para solucionar el problema que se está ejecutando en - Creo que es posible que pueda parchear el encabezado MinGW stdio.h
para que tenga un atributo __attribute__((__format__ (gnu_printf, ...)))
en las funciones de impresión (no están en el nuevo stdio.h
, por lo que GCC usará su idea predeterminada de lo que es el soporte de formato).
Curiosamente, funciona bien con GCC 4.3.4: http://ideone.com/LAPP9. También lo intenté con 4.1.2 y también está bien. –
Uso de MinGW GCC 4.6.1 Recibo advertencias en 'printf()' y 'snprintf()' - ¿Qué distro de MinGW está usando? Actualmente estoy usando la distribución TDM. –
@MichaelBurr: Uh, ni siquiera me di cuenta de que había varias distribuciones de MinGW. Estoy utilizando el "estándar", supongo ([mingw.org] (http://www.mingw.org/), instalado con https://sourceforge.net/projects/mingw/files/Installer/mingw -get-inst /). Sin embargo, eso marcaría la diferencia? – Socob