Eu escrevi um código de teste muito simples 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;
}
Eu uso o ubuntu 11.10 (64 bits) e a versão 4.6.1 do gcc para compilá-lo, mas falhei:
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
e compilá-lo com o gcc, tudo funcionará bem.-std=c11
ou a versão do padrão que você está usando. Isso pega esse e outros erros. Eu também recomendo-Wall -Wextra -Wpedantic -Wconversion
pelo menos.Respostas:
O padrão ISO C99 especifica que essas macros devem ser definidas apenas se solicitadas explicitamente.
fonte
__STDC_FORMAT_MACROS
macro é necessária apenas para inclusão no C ++.__STDC_FORMAT_MACROS
aparece apenas em uma nota de rodapé no C99, sugerindo que o C ++ apenas define essas macros na presença da solicitação. No entanto, o comitê C ++ optou por ignorar a sugestão: por exemplo, no rascunho n3242, 27.9.2 / 3: Nota: As macros definidas por <cinttypes> são fornecidas incondicionalmente. Em particular, o símbolo __STDC_FORMAT_MACROS, mencionado na nota de rodapé 182 do padrão C, não desempenha nenhum papel no C ++. Portanto, quando os compiladores os alcançarem, não precisaremos de__STDC_FORMAT_MACROS
C ou C ++.-std=c++0x
e talvez # incluir <cinttypes> em vez de <inttypes.h>, acredito que forneceria as macros de formato sem você fornecer__STDC_FORMAT_MACROS
.Ao compilar o memcached no Centos 5.xi, ocorreu o mesmo problema.
A solução é atualizar o gcc e o g ++ para a versão 4.4, pelo menos.
Verifique se seu CC / CXX está definido (exportado) para os binários corretos antes de compilar.
fonte
Como você incluiu a tag C ++, você pode usar a biblioteca {fmt} e evitar completamente a
PRIu64
macro e outrosprintf
problemas:O recurso de formatação baseado nesta biblioteca é proposto para padronização em C ++ 20: P0645 .
Isenção de responsabilidade : sou o autor de {fmt}.
fonte
sscanf
?scanf
.std::to_string()
. A página cppreference ainda possui um link apenasstd::to_chars()
, o que não é realmente o que as pessoas precisam. Gostaria de saber sefmt
e / ou c ++ 20 lidam com isso ou não ainda.std::to_string
provavelmente permanecerá como está, masstd::format
permite que você controle se deve usar o código do idioma ou não (e, por padrão, ele não usa o código do idioma).