Napisałem bardzo prosty kod testowy printf uint64_t:
#include <inttypes.h>
#include <stdio.h>
int main()
{
uint64_t ui64 = 90;
printf("test uint64_t : %" PRIu64 "\n", ui64);
return 0;
}
Do kompilacji używam ubuntu 11.10 (64-bitowego) i gcc w wersji 4.6.1, ale nie powiodło się:
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
i skompilujesz go za pomocą gcc, wszystko powinno działać dobrze.-std=c11
lub wersja używanego standardu. To wyłapuje ten i inne błędy. Ja też-Wall -Wextra -Wpedantic -Wconversion
przynajmniej polecam .Odpowiedzi:
Norma ISO C99 określa, że te makra muszą być definiowane tylko na wyraźne żądanie.
źródło
__STDC_FORMAT_MACROS
Makro jest wymagane tylko w przypadku włączenia w C ++.__STDC_FORMAT_MACROS
pojawia się tylko w przypisie w C99, co sugeruje, że C ++ definiuje te makra tylko w obecności żądania. Jednak komisja C ++ zdecydowała się zignorować sugestię: np. W wersji roboczej n3242, 27.9.2 / 3: Uwaga: makra zdefiniowane przez <cinttypes> są dostarczane bezwarunkowo. W szczególności symbol __STDC_FORMAT_MACROS, o którym mowa w przypisie 182 normy C, nie odgrywa żadnej roli w C ++. Więc kiedy kompilatory nadrobią zaległości, nie będziemy potrzebować__STDC_FORMAT_MACROS
ani C, ani C ++.-std=c++0x
<cinttypes> i być może #include zamiast <inttypes.h>, uważam, że zapewniłoby to makra formatu bez konieczności dostarczania__STDC_FORMAT_MACROS
.Podczas kompilacji memcached pod Centos 5.xi napotkałem ten sam problem.
Rozwiązaniem jest aktualizacja gcc i g ++ przynajmniej do wersji 4.4.
Upewnij się, że plik CC / CXX jest ustawiony (wyeksportowany) do odpowiednich plików binarnych przed kompilacją.
źródło
Ponieważ dołączyłeś tag C ++, możesz użyć biblioteki {fmt} i całkowicie uniknąć
PRIu64
makra i innychprintf
problemów:Narzędzie formatowania oparte na tej bibliotece jest proponowane do standaryzacji w C ++ 20: P0645 .
Zastrzeżenie : jestem autorem {fmt}.
źródło
sscanf
?scanf
.std::to_string()
. Strona cppreference nadal zawiera tylko linkistd::to_chars()
, które nie są tak naprawdę tym, czego ludzie potrzebują. Zastanawiam się, czyfmt
i / lub c ++ 20 sobie z tym poradzą, czy jeszcze nie.std::to_string
prawdopodobnie pozostanie bez zmian, alestd::format
pozwala kontrolować, czy używać ustawień regionalnych, czy nie (i domyślnie nie używa ustawień regionalnych).