Potrzebne jest tylko to, aby specyfikatory formatu i typy były zgodne i zawsze możesz rzutować, aby to było prawdą. long
ma co najmniej 32 bity, więc %lu
razem z (unsigned long)k
jest zawsze poprawne:
uint32_t k;
printf("%lu\n", (unsigned long)k);
size_t
jest trudniejszy, dlatego %zu
został dodany w C99. Jeśli nie możesz tego użyć, potraktuj to tak samo k
( long
jest największym typem w C89, size_t
jest mało prawdopodobne, aby był większy).
size_t sz;
printf("%zu\n", sz); /* C99 version */
printf("%lu\n", (unsigned long)sz); /* common C89 version */
Jeśli specyfikatory formatu nie są prawidłowe dla typu, który przekazujesz, printf
spowoduje to odczytanie zbyt dużej lub zbyt małej ilości pamięci z tablicy. Tak długo, jak używasz wyraźnych rzutów, aby dopasować typy, jest przenośny.
uint32_t
z<stdint.h>
lub<inttypes.h>
; jeśli chcesz używać tych typów, powinieneś uaktualnić do C89. Jako rozszerzenie jest prawdopodobne, że GCC pozwala na ich użycie, ale C89 nie miał takiej obsługi.