Se você quiser usar o Qt , terá que aceitar quint8
, quint16
e assim por diante.
Se você quiser usar GLib , você tem que bem-vindo guint8
, guint16
e assim por diante.
No Linux existem u32
, s16
e assim por diante.
uC / OS define SINT32
, UINT16
e assim por diante.
E se você tiver que usar alguma combinação dessas coisas, é melhor estar preparado para problemas. Porque em sua máquina u32
vai typedef
acabar long
e quint32
vai typedef
acabar int
e o compilador vai reclamar .
Por que todo mundo faz isso, se houver <stdint.h>
? Isso é algum tipo de tradição para bibliotecas?
stdint.h
foi inventado.sizeof(int) * CHAR_BIT
(por exemplo) e usar isso? Se seuint
for muito pequeno para representar seu intervalo (por exemplo, um índice de matriz), então quase certamente você não deveria usar deint
qualquer maneira, mas algo parecidosize_t
. Por queint32
faria mais sentido? A única vez que a largura fixa faz sentido é para a comunicação entre sistemas (por exemplo, formato de arquivo / rede) ...uint16_t
(ou talvez seufast
ouleast
variante). Meu ponto é: esses tipos são convenientes de usar e têm sua razão de existência.size_t
e / ouuint64_t
.Respostas:
stdint.h
não existia quando essas bibliotecas estavam sendo desenvolvidas. Assim, cada biblioteca criou seus própriostypedef
s.fonte
Para as bibliotecas mais antigas, isso é necessário porque o cabeçalho em questão (
stdint.h
) não existia.Ainda há, no entanto, um problema: esses tipos (
uint64_t
e outros) são um recurso opcional no padrão. Portanto, uma implementação compatível pode não ser fornecida com eles - e assim forçar as bibliotecas a ainda incluí-los hoje em dia.fonte
uintN_t
tipos são opcionais, mas os tiposuint_leastN_t
euint_fastN_t
não.stdint.h
foi padronizado desde 1999. É mais provável que muitos aplicativos definam (efetivamente alias) tipos para manter independência parcial da arquitetura de máquina subjacente.Eles fornecem aos desenvolvedores a confiança de que os tipos usados em seus aplicativos correspondem às suposições específicas de seu projeto sobre comportamento que podem não corresponder ao padrão de linguagem ou à implementação do compilador.
A prática é espelhada no padrão de design Façade orientado a objetos e é muito utilizada pelos desenvolvedores, invariavelmente, escrevendo classes de wrapper para todas as bibliotecas importadas.
Quando os compiladores eram muito menos padronizados e as arquiteturas de máquina podiam variar de mainframes de 16 bits, 18 bits a 36 bits, isso era muito mais importante. A prática é muito menos relevante agora em um mundo convergindo para sistemas embarcados ARM de 32 bits. Continua sendo uma preocupação para microcontroladores de baixo custo com mapas de memória ímpares .
fonte
stdint.h
foi padronizado desde 1999, mas há quanto tempo está disponível na prática? As pessoas se arrastam na implementação e adoção de novos padrões e, durante esse longo período de transição, os métodos antigos ainda são essenciais.stdint.h
é que mesmo em plataformas onde, por exemplo,long
eint32_t
têm o mesmo tamanho e representação, não há nenhuma exigência de que a conversão de umint32_t*
paralong*
produzirá um ponteiro que pode acessar de forma confiável umint32_t
. Não posso acreditar que os autores do Padrão pensaram que era óbvio que os tipos compatíveis com layout deveriam ser compatíveis com alias, mas como eles não se preocuparam em dizer isso, os autores do gcc e IIRC clang acham que a linguagem seria melhorada ignorando até mesmo o alias nos casos em que é óbvio.-fno-strict-alias
, mas que ainda funcionaria. Mesmo se não houvesse uma base de código existente, nenhum único conjunto de regras poderia atingir o equilíbrio ideal de otimização e semântica para todos os aplicativos, porque aplicativos diferentes têm necessidades diferentes. Adicione a base de código existente e a necessidade de modos diferentes deve ficar clara.Portanto, você tem o poder de typedef char to int.
Um "horror da codificação" mencionou que o cabeçalho de uma empresa tinha um ponto em que um programador queria um valor booleano e um char era o tipo nativo lógico para o trabalho, e assim escreveu
typedef bool char
. Então, mais tarde, alguém descobriu que um inteiro era a escolha mais lógica e escreveutypedef bool int
. O resultado, muito antes do Unicode, era virtualmentetypedef char int
.Muita compatibilidade com visão de futuro, eu acho.
fonte