Как сказал АраК, интерфейс потоков c ++ всегда будет работать переносимо.
std :: size_t s = 1024;std :: cout << s;// или любой другой вид потока, например, stringstream!</p>
Если вы хотите использовать C stdio, для некоторых случаев «portable» не существует переносимого ответа на этот вопрос.И это уродливо, потому что, как вы уже видели, выбор неправильных флагов формата может привести к предупреждению компилятора или неверному выводу.
C99 пытался решить эту проблему с помощью форматов inttypes.h, таких как "%" PRIdMAX "\п».Но, как и в случае с «% zu», не все поддерживают c99 (как MSVS до 2013 года).Для решения этой проблемы существуют файлы "msinttypes.h".
Если вы приведете к другому типу, в зависимости от флагов вы можете получить предупреждение компилятора об усечении или изменении знака.Если вы идете по этому маршруту, выберите больший соответствующий тип фиксированного размера.Один из unsigned long long и "% llu" или unsigned long "% lu" должен работать, но llu также может замедлить работу в 32-битном мире как слишком большой.(Изменить - мой Mac выдает предупреждение в 64-битной версии, что% llu не соответствует size_t, хотя% lu,% llu и size_t имеют одинаковый размер. И% lu и% llu не совпадают по размеру на моем MSVS2012.вам может понадобиться привести + использовать соответствующий формат.)
В этом отношении вы можете использовать типы фиксированного размера, такие как int64_t.Но ждать!Теперь мы вернулись к c99 / c ++ 11, и старый MSVS снова дает сбой.Кроме того, у вас также есть приведения (например, map.size () не является фиксированным размером)!
Вы можете использовать сторонний заголовок или библиотеку, например, boost.Если вы еще не используете его, возможно, вы не захотите раздувать свой проект таким образом.Если вы готовы добавить один только для этой проблемы, почему бы не использовать потоки C ++ или условную компиляцию?
Итак, вы знакомы с потоками c ++, условной компиляцией, сторонними фреймворками или чем-то вроде портативного устройства, которое работает на вас.