2012-05-26 4 views
13

Estoy tratando de deshacerme de una advertencia falsa en mi programa. Bajo Windows 64 (en Linux no existe tal aviso) esta declaración:printf y% llx en GCC en Windows 64x

printf("%llu",UINT64_MAX); 

genera la advertencia siguiente:

warning: unknown conversion type character 'l' in format [-Wformat]| 

La salida parece ser correcta y la advertencia no debería estar ahí. La publicación más relevante relacionada con gcc que puedo encontrar es este informe de error de 2008 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37768

Si entiendo correctamente de acuerdo con eso, esta advertencia se debe al hecho de que bajo el capó gcc llama a MSVC printf que no cumple con C99 y puede No entiendo el formato largo sin firmar en printf. Desde la misma página, la solución sugerida es usar algo llamado gnu_printf. Intenté googlearlo, pero no encontré un encabezado para incluir.

Entonces, la pregunta es ¿cómo se debe manejar esto para ser portátil? Solo quiero deshacerme de la advertencia de una manera correcta y no descuidada.

+0

Obtengo la advertencia de todos modos también usando PRIu64/PRId64 y similar ... esto es porque la sintaxis que escribió no es compatible con C++ 11 – gabry

+0

si siente que tiene una solución que no está cubierta en otra respuesta, se recomienda publica una respuesta. Por favor, no edite la pregunta para incluir la respuesta. He retrocedido tu edición. – bolov

Respuesta

7

Como os supongo probablemente ya sabe, desde http://comments.gmane.org/gmane.comp.gnu.mingw.w64.general/4670 (nota: vínculo roto; ver la Internet Archive's copy),

el tema es que especificador formateador de ancho %ll no es compatible con todos los msvcrt -DLL versiones, por lo tanto, gcc advierte sobre su uso. La variante para especificar un ancho escalar entero de 64 bits en el formateador para msvcrt en una forma compatible hacia atrás es mediante el uso de %I64.

+3

Gracias. Aunque usar% I64 funciona, no es la respuesta portátil, ¡pero ese enlace me lleva a eso! Ver, de hecho, la respuesta se encuentra dentro de . Tienen macros para la forma adecuada de llamar al formato de cada variable allí. Entonces en mi caso para uint64_t usaré PRIu64. – Lefteris

0

Con gcc 6.2.1 puede usar la opción -fno-builtin.

Esa opción hace que gcc piense que printf no está incorporado (que es el caso, después de todo), y la advertencia desaparece, printf se trata como cualquier función que haya escrito.

Sin embargo, es muy cuidadoso, ya que no se realiza ninguna comprobación de formato en ese caso, y hay otros efectos secundarios ya que hay otros complementos cubiertos por esa opción.

Una mejor alternativa es no utilizar la versión de Microsoft printfen absoluto mediante el establecimiento de la macro __USE_MINGW_ANSI_STDIO con:

gcc -D__USE_MINGW_ANSI_STDIO=1 ... 

(ref: C program shows %zu after conversion to Windows). Permite utilizar el especificador %zu, que Microsoft printf no admite y sigue formateando las advertencias.