Я написал очень простой тестовый код printf uint64_t:
#include <inttypes.h>
#include <stdio.h>
int main()
{
uint64_t ui64 = 90;
printf("test uint64_t : %" PRIu64 "\n", ui64);
return 0;
}
Я использую ubuntu 11.10 (64 бит) и gcc версии 4.6.1 для его компиляции, но не смог:
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
и скомпилируете его с помощью gcc, все должно работать нормально.-std=c11
версию используемого стандарта. Это отлавливает эту и другие ошибки. Я также рекомендую-Wall -Wextra -Wpedantic -Wconversion
по крайней мере.Ответы:
Стандарт ISO C99 указывает, что эти макросы должны быть определены только в случае явного запроса.
источник
__STDC_FORMAT_MACROS
Макросов требуется только для включения в C ++.__STDC_FORMAT_MACROS
появляется только в сноске в C99, предполагая, что C ++ определяет эти макросы только при наличии запроса. Однако комитет C ++ решил проигнорировать это предложение: например, в черновике n3242, 27.9.2 / 3: Примечание: макросы, определенные в <cinttypes>, предоставляются безоговорочно. В частности, символ __STDC_FORMAT_MACROS, упомянутый в сноске 182 стандарта C, не играет никакой роли в C ++. Поэтому, когда компиляторы наверстают упущенное, нам не понадобится__STDC_FORMAT_MACROS
ни C, ни C ++.-std=c++0x
и, возможно, #include <cinttypes>, а не <inttypes.h>, я считаю, что он предоставит макросы формата без вашего предложения__STDC_FORMAT_MACROS
.При компиляции memcached под Centos 5.xi возникла та же проблема.
Решение - обновить gcc и g ++ как минимум до версии 4.4.
Перед компиляцией убедитесь, что ваш CC / CXX установлен (экспортирован) в правые двоичные файлы.
источник
Поскольку вы включили тег C ++, вы можете использовать библиотеку {fmt} и вообще избежать
PRIu64
макросов и другихprintf
проблем:Средство форматирования, основанное на этой библиотеке, предлагается для стандартизации в C ++ 20: P0645 .
Отказ от ответственности : я автор {fmt}.
источник
sscanf
?scanf
.std::to_string()
. Страница cppreference по-прежнему ссылается только на тоstd::to_chars()
, что не совсем то, что нужно людям. Интересно,fmt
и / или C ++ 20 справиться с этим или нет.std::to_string
вероятно, останется как есть, ноstd::format
позволит вам контролировать, использовать языковой стандарт или нет (и по умолчанию он не использует языковой стандарт).