Escribí un código de prueba muy simple de printf uint64_t:
#include <inttypes.h>
#include <stdio.h>
int main()
{
uint64_t ui64 = 90;
printf("test uint64_t : %" PRIu64 "\n", ui64);
return 0;
}
Utilizo ubuntu 11.10 (64 bit) y gcc versión 4.6.1 para compilarlo, pero fallé:
main.cpp: In function ‘int main()’:
main.cpp:9:30: error: expected ‘)’ before ‘PRIu64’
main.cpp:9:47: warning: spurious trailing ‘%’ in format [-Wformat]
main.c
y lo compila con gcc, todo debería funcionar bien.-std=c11
o la versión del estándar que está utilizando. Eso atrapa este y otros errores. También recomiendo-Wall -Wextra -Wpedantic -Wconversion
al menos.Respuestas:
El estándar ISO C99 especifica que estas macros solo deben definirse si se solicitan explícitamente.
fuente
__STDC_FORMAT_MACROS
macro solo es necesaria para su inclusión en C ++.__STDC_FORMAT_MACROS
aparece solo en una nota al pie en C99, lo que sugiere que C ++ solo define estas macros en presencia de la solicitud. Sin embargo, el comité de C ++ decidió ignorar la sugerencia: por ejemplo, en el borrador n3242, 27.9.2 / 3: Nota: Las macros definidas por <cinttypes> se proporcionan incondicionalmente. En particular, el símbolo __STDC_FORMAT_MACROS, mencionado en la nota al pie 182 del estándar C, no juega ningún papel en C ++. Entonces, cuando los compiladores se pongan al día, no necesitaremos__STDC_FORMAT_MACROS
C ni C ++.-std=c++0x
y tal vez #incluye <cinttypes> en lugar de <inttypes.h>, creo que proporcionaría las macros de formato sin que usted proporcione__STDC_FORMAT_MACROS
.Al compilar memcached en Centos 5.xi, tuve el mismo problema.
La solución es actualizar gcc y g ++ a la versión 4.4 al menos.
Asegúrese de que su CC / CXX esté configurado (exportado) en binarios correctos antes de compilar.
fuente
Como ha incluido la etiqueta C ++, puede usar la biblioteca {fmt} y evitar la
PRIu64
macro y otrosprintf
problemas por completo:La facilidad de formateo basada en esta biblioteca se propone para la estandarización en C ++ 20: P0645 .
Descargo de responsabilidad : soy el autor de {fmt}.
fuente
sscanf
?scanf
.std::to_string()
. La página cppreference todavía está vinculada solo astd::to_chars()
, que no es realmente lo que la gente necesita. Me pregunto sifmt
y / o c ++ 20 lidiar con él o no todavía.std::to_string
probablemente permanecerá como está, pero lestd::format
permite controlar si usar la configuración regional o no (y de manera predeterminada no usa la configuración regional).