AraK'ın dediği gibi, c ++ akış arayüzü her zaman portatif olarak çalışacaktır.
std :: size_t s = 1024; std :: cout << s; // veya stringstream gibi başka herhangi bir akış!
C stdio istiyorsanız, bazı "taşınabilir" durumlar için buna taşınabilir bir cevap yoktur. Gördüğünüz gibi, yanlış format bayraklarını seçmek derleyici uyarısı verebilir veya yanlış çıktı verebilir.
C99 bu sorunu "%" PRIdMAX "\ n" gibi inttypes.h formatlarıyla çözmeye çalıştı. Ancak "% zu" ile olduğu gibi, herkes c99'u desteklemez (2013'ten önceki MSVS gibi). Bu sorunu çözmek için yüzen "msinttypes.h" dosyaları vardır.
Farklı bir türe döküm yaparsanız, bayraklara bağlı olarak kesme veya işaret değişikliği için derleyici uyarısı alabilirsiniz. Bu rotaya giderseniz, daha büyük bir ilgili sabit boyut türü seçin. İmzasız uzun uzun ve "% llu" veya imzasız uzun "% lu" dan biri çalışmalıdır, ancak llu ayrıca 32 bitlik bir dünyada işleri aşırı derecede büyük ölçüde yavaşlatabilir. (Düzenle - mac'um,% lu,% llu ve size_t öğelerinin tümü aynı boyutta olmasına rağmen% llu için size_t ile eşleşmeyen 64 bitlik bir uyarı veriyor. MSVS2012'de% lu ve% llu aynı boyutta değil. eşleşen bir biçimi yayınlamanız + kullanmanız gerekebilir.)
Bu nedenle, int64_t gibi sabit boyut türleriyle gidebilirsiniz. Fakat bekle! Şimdi c99 / c ++ 11'e geri döndük ve eski MSVS tekrar başarısız oluyor. Ayrıca, yayınlarınız da var (ör. Map.size () sabit boyutlu bir tür değildir)!
3. taraf üstbilgisi veya boost gibi bir kitaplık kullanabilirsiniz. Zaten bir tane kullanmıyorsanız, projenizi bu şekilde şişirmek istemeyebilirsiniz. Sadece bu sorun için bir tane eklemek istiyorsanız, neden c ++ akışları veya koşullu derleme kullanmıyorsunuz?
Yani c ++ akışlarına, koşullu derlemeye, 3. taraf çerçevelerine veya sizin için işe yarayacak taşınabilir bir şeye bağlısınız.
unsigned long
libc uygulamanızz
değiştiriciyi desteklemiyorsa, döküm yapmak en iyi seçenektir ; C99 standardısize_t
, tamsayı dönüşüm sıralamasının daha yüksek olmamasını önerirlong
, bu nedenle oldukça güvenlisiniz