In C, che significato ha il t
alla fine di tipi interi come uint8_t
e int32_t
? Da dove è nato? Perché il tipo non è stato appena chiamato int32
?
In C, che significato ha il t
alla fine di tipi interi come uint8_t
e int32_t
? Da dove è nato? Perché il tipo non è stato appena chiamato int32
?
Poiché tutti gli identificatori che terminano con _t
sono riservati per futuri tipi aggiuntivi.
La famiglia di tipi int32_t
è stata aggiunta nello standard C99, quindi hanno utilizzato i nomi riservati per evitare conflitti con il software già esistente.
Puoi trovare una buona panoramica dei nomi riservati nella documentazione di glibc .
Nota:
Poiché Microsoft non è il comitato per gli standard C, ha ragione a non utilizzare la famiglia di nomi _t
, optando invece per il% nonINT32
riservato.
Al momento della ratifica dello standard C99 esistevano già innumerevoli programmi C che utilizzavano int32
come identificatore. Su piattaforme in cui int
e long
erano 32 bit, parte di quel codice preesistente avrebbe definito int32
come int
e alcuni come long
(quest'ultimo consente la compatibilità con piattaforme in cui int
è 16 bit ma long
è 32, il primo consente la compatibilità con piattaforme in cui int
è 32 bit ma long
è 64). Mentre avrebbe potuto avere senso che i compilatori consentissero "int" e "long" anche sulle piattaforme in cui sono entrambi a 32 bit e hanno rappresentazioni corrispondenti, nel qual caso il "nuovo"% tipo% di tipo_dog potrebbe essere compatibile con entrambi, lo standard non lo consente.
Il codice scritto per una piattaforma in cui int32
è conosciuto come sinonimo di int32
può utilizzare int
e int*
in modo intercambiabile. Il codice scritto per una piattaforma in cui int32*
è conosciuto come sinonimo di int32
può utilizzare long
e int32*
in modo intercambiabile. Anche su piattaforme in cui long*
e int
hanno rappresentazioni identiche, tuttavia, lo Standard richiede piattaforme squawk se si tenta di convertire un long
in int*
o viceversa senza cast.
Inoltre, anche su piattaforme in cui long*
e int
hanno la stessa rappresentazione, il casting di un long
a un int*
non è richiesto per ottenere un puntatore utilizzabile come long*
; gli attuali manutentori di gcc ritengono che dal momento che lo Standard non richiede che tale cast funzioni, il compilatore dovrebbe generare codice in cui tali caste a volte falliscono.
Quindi, se C99 avesse usato long*
piuttosto che int32
, avrebbe dovuto interrompere il codice che definisce quell'identificatore come int32_t
e si aspetta che sia sinonimo di int
, o codice che definisce ciò che definisce quell'identificatore come int
e si aspetta che sia sinonimo di long
.
I tipi di dati _t sono tipi typedef nell'intestazione stdint.h, mentre int è un tipo di dati fondamentali incorporato in C. I tipi di dati _t sono disponibili solo se stdint.h esiste. I tipi di dati fondamentali come int
, tuttavia, sono garantiti per esistere.
Fondamentalmente, non significa molto di niente. È proprio come C ha deciso di nominare le cose.
size_t viene letto come "tipo di dimensione"
_t di solito significa tipo, e talvolta typedef.
Why wasn't the type just called int32
Quindi potrebbe essere distinto da un tipo built-in, stdint.h dovrebbe scegliere il tipo integrato appropriato per essere la dimensione data a seconda della piattaforma. N.B. alcuni compilatori int32_t alias una notazione specifica del compilatore come i_32 o qualcosa di simile.
Microsoft ha adottato un approccio diverso e il loro standard si basa su #defines, con valori come INT32, DWORD, ecc.
Leggi altre domande sui tag c data-types type-systems etymology