Проблема заключается в том, что на одной платформе (окна, mvsc2015) uint64_t
определяется как unsigned long long
и на другой (убунту, лязг) это unsigned long
и есть код, который выглядит как sprintf(buffer, "%#llx", u64key);
Есть ли способ исправить предупреждения спецификаторов формата для типов stdint?
ответ
Решение использовать формат С99 в макросы, в частности, PRIu64
в течение uint64_t
:
#include <inttypes.h>
…
sprintf(buffer, "%#" PRIu64 "\n", u64key);
решением Паскаля является наиболее прямыми и наиболее идиоматическими для этого конкретного типа, но и для записи, альтернативы для печати произвольных целочисленных типов, определение которых вы не знаете, просто литье до intmax_t
или uintmax_t
, затем с использованием модификатора j
(например, %jd
или %ju
). Однако это может не работать для большинства/всех версий стандартной библиотеки MSVC, поскольку они отстают от соответствия стандартам.
Вы можете использовать директивы препроцессора для определения того, как определяется тип данных и скомпилировать другую строку sprintf() с другой строкой.
«использовать препроцессорные директивы для определения того, как определяется тип данных» - ... как? – melpomene
Не могли бы вы привести пример, поскольку мой MSVC (который был вопросом) 2009 не имеет ни 'inttypes.h', ни' PRIu64' в любом другом заголовке. –
@WeatherVane Что непонятно в ответе? – melpomene
@melpomene отсутствие примера. –