Platform onafhanklike size_t Format spesifiseerders in c?
-
22-09-2019 - |
Vra
Ek wil uit te druk 'n veranderlike van tipe size_t
in C maar dit wil voorkom asof size_t
is gealiasseer na verskillende soorte veranderlike op verskillende platforms. Byvoorbeeld, op 'n masjien (64-bit) die volgende kode nie enige waarskuwings gooi:
size_t size = 1;
printf("the size is %ld", size);
maar op my ander masjien (32-bit) die bo-kode produseer die volgende waarskuwing boodskap:
waarskuwing: formaat '% ld "verwag tipe 'N lang int *', maar argument 3 het tipe 'Size_t *'
Ek vermoed dit is te danke aan die verskil in wyser grootte, sodat op my 64-bit masjien size_t
is gealiasseer na 'n long int
("%ld"
), terwyl op my 32-bit masjien size_t
is gealiasseer na 'n ander soort.
Is daar 'n formaat specific spesifiek vir size_t
?
Oplossing
Ja: gebruik die z
lengte wysiger:
size_t size = sizeof(char);
printf("the size is %zu\n", size); // decimal size_t ("u" for unsigned)
printf("the size is %zx\n", size); // hex size_t
Die ander lengte wysigers wat beskikbaar is hh
(vir char
), h
(vir short
), l
(vir long
), ll
(vir long long
), j
(vir intmax_t
), t
(vir ptrdiff_t
), en L
( vir long double
). Sien §7.19.6.1 (7) van die C99 standaard.
Ander wenke
Ja, daar is. Dit is %zu
(soos in ANSI C99).
size_t size = 1;
printf("the size is %zu", size);
Let daarop dat size_t
is unsigned, dus %ld
is dubbel verkeerd: verkeerde lengte wysiger en verkeerde formaat omskakeling specific. In geval jy wonder, %zd
is vir ssize_t
(wat onderteken).
MSDN , sê dat Visual Studio ondersteun die "Ek" voorvoegsel vir-kode draagbare op 32 en 64 bit platforms.
size_t size = 10;
printf("size is %Iu", size);