Як сказав AraK, інтерфейс потоків c ++ завжди працюватиме портативно.
std :: size_t s = 1024; std :: cout << s; // або будь-який інший вид потоку, як stringstream!
Якщо ви хочете, щоб C stdio, для деяких випадків "портативного" відповіді на це немає, відповідь на це не існує. І це стає некрасиво, оскільки, як ви вже бачили, вибір прапорів неправильного формату може спричинити попередження компілятора або дати неправильний вихід.
C99 намагався вирішити цю проблему за допомогою inttypes.h форматів, таких як "%" PRIdMAX "\ n". Але так само, як і у "% zu", не всі підтримують c99 (як MSVS до 2013 року). Існують файли "msinttypes.h", які плавають навколо, щоб вирішити це.
Якщо ви перейдете до іншого типу, залежно від прапорів, ви можете отримати попередження компілятора про усічення або зміну знака. Якщо ви йдете цим маршрутом, виберіть більший відповідний тип фіксованого розміру. Один з неподписаних довгих довгих і "% llu" або неподписаних довгих "% 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
, так що ви досить безпечні