Как сказал АраК, интерфейс потоков c ++ всегда будет работать переносимо.
std :: size_t s = 1024; std :: cout << s; // или любой другой вид потока, например, stringstream!
Если вы хотите использовать C stdio, для некоторых случаев «портативного» ответа на этот вопрос не существует. И это уродливо, поскольку, как вы уже видели, выбор неправильных флагов формата может привести к предупреждению компилятора или неверному выводу.
C99 пытался решить эту проблему с помощью таких форматов inttypes.h, как "%" PRIdMAX "\ n". Но, как и в случае с «% 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 ++, условной компиляцией, сторонними фреймворками или чем-то вроде портативного устройства, которое работает на вас.
unsigned long
- лучший вариант, если ваша реализация libc не поддерживаетz
модификатор; стандарт C99 рекомендуетsize_t
не иметь целочисленного ранга преобразования выше, чемlong
, поэтому вы достаточно безопасны