Quero imprimir uma variável do tipo size_t
em C, mas parece que size_t
tem um alias para diferentes tipos de variáveis em diferentes arquiteturas. Por exemplo, em uma máquina (64 bits), o código a seguir não emite nenhum aviso:
size_t size = 1;
printf("the size is %ld", size);
mas na minha outra máquina (32 bits), o código acima produz a seguinte mensagem de aviso:
aviso: o formato '% ld' espera o tipo 'long int *', mas o argumento 3 tem o tipo 'size_t *'
Suspeito que isso seja devido à diferença no tamanho do ponteiro, de modo que na minha máquina de 64 bits o size_t
alias é a long int
( "%ld"
), enquanto na minha máquina de 32 bits o size_t
alias é outro tipo.
Existe um especificador de formato especificamente para size_t
?
c
platform-independent
size-t
format-string
format-specifiers
Ethan Heilman
fonte
fonte
&
em algum lugar?warning: format '%ld' expects type 'long int *', but argument 3 has type 'size_t *'
quando provavelmente deveriam estar dizendowarning: format '%ld' expects type 'long int', but argument 3 has type 'size_t'
. Você estava usandoscanf()
quando recebeu esses avisos?Respostas:
Sim: use o
z
modificador de comprimento: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
Os outros modificadores de comprimento disponíveis são
hh
(parachar
),h
(parashort
),l
(paralong
),ll
(paralong long
),j
(paraintmax_t
),t
(paraptrdiff_t
) eL
(paralong double
). Consulte §7.19.6.1 (7) da norma C99.fonte
size_t
e umssize_t
; o último raramente é usado.%zu
, porque o argumento não tem sinal.z
modificador de comprimento não faz parte do C89 / C90. Se você está visando um código compatível com C89, o melhor que você pode fazer é lançarunsigned long
e usar ol
modificador de comprimento, por exemploprintf("the size is %lu\n", (unsigned long)size);
; suportar C89 e sistemas comsize_t
maior do quelong
é mais complicado e exigiria o uso de uma série de macros de pré-processador.Sim existe. É
%zu
(conforme especificado em ANSI C99).size_t size = 1; printf("the size is %zu", size);
Observe que
size_t
não tem sinal, portanto,%ld
é duplamente errado: modificador de comprimento errado e especificador de conversão de formato errado. Caso você se pergunte,%zd
é parassize_t
(que está assinado).fonte
MSDN , afirma que o Visual Studio oferece suporte ao prefixo "I" para código portátil em plataformas de 32 e 64 bits.
size_t size = 10; printf("size is %Iu", size);
fonte