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