2015-07-26 2 views
3

Проблема заключается в том, что на одной платформе (окна, mvsc2015) uint64_t определяется как unsigned long long и на другой (убунту, лязг) это unsigned long и есть код, который выглядит как sprintf(buffer, "%#llx", u64key);Есть ли способ исправить предупреждения спецификаторов формата для типов stdint?

ответ

10

Решение использовать формат С99 в макросы, в частности, PRIu64 в течение uint64_t:

#include <inttypes.h> 
… 
sprintf(buffer, "%#" PRIu64 "\n", u64key); 
4

решением Паскаля является наиболее прямыми и наиболее идиоматическими для этого конкретного типа, но и для записи, альтернативы для печати произвольных целочисленных типов, определение которых вы не знаете, просто литье до intmax_t или uintmax_t, затем с использованием модификатора j (например, %jd или %ju). Однако это может не работать для большинства/всех версий стандартной библиотеки MSVC, поскольку они отстают от соответствия стандартам.

+0

Не могли бы вы привести пример, поскольку мой MSVC (который был вопросом) 2009 не имеет ни 'inttypes.h', ни' PRIu64' в любом другом заголовке. –

+1

@WeatherVane Что непонятно в ответе? – melpomene

+2

@melpomene отсутствие примера. –

-1

Вы можете использовать директивы препроцессора для определения того, как определяется тип данных и скомпилировать другую строку sprintf() с другой строкой.

+0

«использовать препроцессорные директивы для определения того, как определяется тип данных» - ... как? – melpomene

 Смежные вопросы

  • Нет связанных вопросов^_^