Jak powiedział AraK, interfejs strumieni c ++ zawsze będzie działał przenośnie.
std :: size_t s = 1024; std :: cout << s; // lub jakikolwiek inny strumień, taki jak stringstream!
Jeśli chcesz C stdio, nie ma przenośnej odpowiedzi na to pytanie w niektórych przypadkach „przenośnych”. I robi się brzydko, ponieważ, jak widzieliście, wybranie flag w niewłaściwym formacie może wygenerować ostrzeżenie kompilatora lub dać niepoprawne dane wyjściowe.
C99 próbował rozwiązać ten problem za pomocą formatów inttypes.h, takich jak „%” PRIdMAX ”\ n”. Ale podobnie jak w przypadku „% zu”, nie każdy obsługuje c99 (jak MSVS przed 2013 rokiem). Istnieją pliki „msinttypes.h” pływające wokół, aby sobie z tym poradzić.
Jeśli wybierzesz inny typ, w zależności od flag możesz otrzymać ostrzeżenie kompilatora o obcięciu lub zmianie znaku. Jeśli wybierzesz tę trasę, wybierz większy odpowiedni stały rozmiar. Jeden z niepodpisanych długich długich i „% llu” lub niepodpisanych długich „% lu” powinien działać, ale llu może również spowolnić rzeczy w 32-bitowym świecie jako zbyt dużym. (Edycja - mój Mac wyświetla ostrzeżenie w 64-bitowej wersji, jeśli% llu nie pasuje do size_t, mimo że% lu,% llu i size_t są tego samego rozmiaru. A% lu i% llu nie są tego samego rozmiaru na moim MSVS2012. być może będziesz musiał przesłać + użyć formatu, który pasuje.)
W tym przypadku możesz przejść ze stałymi typami rozmiarów, takimi jak int64_t. Ale poczekaj! Teraz wróciliśmy do c99 / c ++ 11, a starszy MSVS ponownie zawiedzie. Dodatkowo masz również casty (np. Map.size () nie jest stałym typem rozmiaru)!
Możesz użyć nagłówka lub biblioteki innej firmy, takiej jak boost. Jeśli jeszcze go nie używasz, możesz nie chcieć zawyżać swojego projektu w ten sposób. Jeśli chcesz dodać jeden tylko dla tego problemu, dlaczego nie użyć strumieni c ++ lub kompilacji warunkowej?
Więc sprowadzasz się do strumieni c ++, kompilacji warunkowej, frameworków zewnętrznych lub czegoś w rodzaju przenośnego urządzenia, które akurat działa.
unsigned long
jest najlepszą opcją, jeśli twoja implementacja libc nie obsługujez
modyfikatora; standard C99 zaleca,size_t
aby nie mieć rangi konwersji liczb całkowitych większych niżlong
, więc jesteś względnie bezpieczny