Chcę wydrukować zmienną typu size_t
w C, ale wygląda na to, że size_t
jest aliasowana do różnych typów zmiennych na różnych architekturach. Na przykład na jednym komputerze (64-bitowym) poniższy kod nie generuje żadnych ostrzeżeń:
size_t size = 1;
printf("the size is %ld", size);
ale na moim innym komputerze (32-bitowym) powyższy kod generuje następujący komunikat ostrzegawczy:
ostrzeżenie: format „% ld” oczekuje typu „long int *”, ale argument 3 ma typ „size_t *”
Podejrzewam, że jest to spowodowane różnicą w rozmiarze wskaźnika, tak że na mojej 64-bitowej maszynie size_t
jest aliasowany do a long int
( "%ld"
), podczas gdy na mojej 32-bitowej maszynie size_t
jest aliasowany do innego typu.
Czy istnieje specyfikator formatu specjalnie dla size_t
?
c
platform-independent
size-t
format-string
format-specifiers
Ethan Heilman
źródło
źródło
&
gdzieś?warning: format '%ld' expects type 'long int *', but argument 3 has type 'size_t *'
kiedy to prawdopodobnie powinno się mówićwarning: format '%ld' expects type 'long int', but argument 3 has type 'size_t'
. Czyscanf()
zamiast tego korzystałeś z tych ostrzeżeń?Odpowiedzi:
Tak: użyj
z
modyfikatora długości: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
Inne dostępne modyfikatory długości to
hh
(zachar
),h
(zashort
),l
(zalong
),ll
(zalong long
),j
(zaintmax_t
),t
(zaptrdiff_t
) iL
(zalong double
). Patrz §7.19.6.1 (7) standardu C99.źródło
size_t
i anssize_t
; ten ostatni jest rzadko używany.%zu
, ponieważ argument jest bez znaku.z
modyfikator długości nie jest częścią C89 / C90. Jeśli celujesz w kod zgodny z C89, najlepsze, co możesz zrobić, to rzutowaćunsigned long
i użyćl
zamiast tego modyfikatora długości, npprintf("the size is %lu\n", (unsigned long)size);
.; obsługa zarówno C89, jak i systemów zsize_t
większymi niżlong
jest trudniejsza i wymagałaby użycia wielu makr preprocesora.Tak jest. Jest
%zu
(jak określono w ANSI C99).size_t size = 1; printf("the size is %zu", size);
Zauważ, że
size_t
jest bez znaku, więc%ld
jest podwójnie błędny: zły modyfikator długości i niewłaściwy specyfikator konwersji formatu. Jeśli się zastanawiasz,%zd
jest dlassize_t
(który jest podpisany).źródło
MSDN mówi, że Visual Studio obsługuje prefiks „I” dla kodu przenośnego na platformach 32- i 64-bitowych.
size_t size = 10; printf("size is %Iu", size);
źródło