Che cosa significa la "t" in int32_t?

6

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 ?

    
posta ahalekelly 07.07.2015 - 19:35
fonte

4 risposte

7

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.

    
risposta data 07.07.2015 - 23:02
fonte
5

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 .

    
risposta data 25.05.2016 - 17:42
fonte
3

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.

    
risposta data 07.07.2015 - 19:37
fonte
2

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.

    
risposta data 07.07.2015 - 22:28
fonte

Leggi altre domande sui tag