Especificadores de formato size_t independentes de plataforma em c?
-
22-09-2019 - |
Pergunta
Quero imprimir uma variável do tipo size_t
em C, mas parece que size_t
tem 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 gera 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:formato '%ld' espera tipo 'long int *', mas o argumento 3 tem tipo 'size_t *'
Suspeito que isso se deva à diferença no tamanho do ponteiro, de modo que na minha máquina de 64 bits size_t
é alias de um long int
("%ld"
), enquanto na minha máquina de 32 bits size_t
é alias para outro tipo.
Existe um especificador de formato específico para size_t
?
Solução
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
(para char
), h
(para short
), l
(para long
), ll
(para long long
), j
(para intmax_t
), t
(para ptrdiff_t
), e L
(para long double
).Consulte §7.19.6.1 (7) da norma C99.
Outras dicas
Sim existe.Isso é %zu
(conforme especificado em ANSI C99).
size_t size = 1;
printf("the size is %zu", size);
Observe que size_t
não está assinado, portanto %ld
está duplamente errado:modificador de comprimento errado e especificador de conversão de formato errado.Caso você esteja se perguntando, %zd
é para ssize_t
(que está assinado).
MSDN, diz 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);