Domanda

Sembra una domanda semplice, ma non riesco a trovarla con la ricerca Stack Overflow o Google. Cosa significa un tipo seguito da un _t? Come

int_t anInt;

Lo vedo molto nel codice C inteso a gestire da vicino l'hardware & # 8212; non posso fare a meno di pensare che siano correlati.

È stato utile?

Soluzione

Come notato da Douglas Mayle, sostanzialmente denota un nome di tipo. Di conseguenza, verrebbe sconsigliato di terminare i nomi di variabili o funzioni con '_t' poiché ciò potrebbe causare confusione. Oltre a size_t, lo standard C89 definisce wchar_t, off_t, ptrdiff_t e probabilmente alcuni altri che ho dimenticato. Lo standard C99 definisce molti altri tipi, come uintptr_t, intmax_t, int8_t, uint_least16_t, uint_fast32_t e così via. Questi nuovi tipi sono definiti formalmente in <stdint.h> ma molto spesso utilizzerai <inttypes.h> che (insolitamente per le intestazioni C standard) include printf(). (scanf()) definisce anche le macro da utilizzare con <=> e <=>.

Come notato da Matt Curtis, non c'è significato per il compilatore nel suffisso; è una convenzione orientata all'uomo.

Tuttavia, dovresti anche notare che POSIX definisce molti nomi di tipi extra che terminano con " <=> "e si riserva il suffisso per l'implementazione. Ciò significa che se si lavora su sistemi correlati a POSIX, la definizione dei nomi dei propri tipi con la convenzione è sconsigliata. Il sistema su cui lavoro lo ha fatto (per più di 20 anni); veniamo regolarmente inciampati da sistemi che definiscono tipi con lo stesso nome che definiamo.

Altri suggerimenti

È una convenzione utilizzata per la denominazione dei tipi di dati, ad esempio con typedef:


typedef struct {
  char* model;
  int year;
...
} car_t;

Il _t solitamente racchiude una definizione di tipo opaco.

GCC si limita ad aggiungere nomi che terminano con foo_t allo spazio dei nomi riservato che non è possibile utilizzare, per evitare conflitti con le versioni future di Standard C e POSIX (manuale della libreria GNU C) . Dopo alcune ricerche, ho finalmente trovato il riferimento corretto all'interno dello standard POSIX (1003.1, Rationale (Informative)):

  

B.2.12 Tipi di dati

     

Il requisito che i tipi aggiuntivi definiti in questa sezione terminino in & # 8216; & # 8216; _t & # 8217; & # 8217; è stato richiesto dal   problema di inquinamento dello spazio dei nomi. È difficile definire un tipo (dove quel tipo non è uno   definito da IEEE Std 1003.1-2001) in un file di intestazione e utilizzarlo in un altro senza aggiungere simboli   nello spazio dei nomi del programma. Per consentire agli implementatori di fornire i propri tipi, tutti   sono richieste applicazioni conformi per evitare che i simboli finiscano con & # 8216; & # 8216; _t & # 8217; & # 8217 ;, che consente   implementatore per fornire tipi aggiuntivi. Perché un uso importante dei tipi è nella definizione di   membri della struttura, che possono (e in molti casi devono) essere aggiunti alle strutture definite in   IEEE Std 1003.1-2001, la necessità di ulteriori tipi è convincente.

In breve, lo Standard afferma che ci sono buone possibilità di estendere l'elenco dei tipi di Standard, quindi lo Standard limita lo spazio dei nomi <=> per il proprio uso.

Ad esempio, il tuo programma corrisponde a POSIX 1003.1 Issues 6 e hai definito un tipo <=>. POSIX 1003.1 Issues 7 viene infine rilasciato con un nuovo tipo definito <=>. Il tuo programma non corrisponde alla nuova versione, il che potrebbe essere un problema. La limitazione dell'utilizzo di <=> impedisce il refactoring del codice. Pertanto, se miri a una conformità POSIX, dovresti assolutamente evitare il <=> come indicato dallo Standard.

Nota a margine: personalmente, cerco di attenermi a POSIX perché penso che fornisca buone basi per una programmazione pulita. Inoltre, sono piuttosto appassionato delle Linux Coding Style (capitolo 5) linee guida. Ci sono alcuni buoni motivi per non usare typedef. Spero che questo aiuto!

È una convenzione di denominazione standard per i tipi di dati, generalmente definita da typedefs. Un sacco di codice C che si occupa di registri hardware utilizza nomi standard definiti da C99 per tipi di dati a dimensione fissa con segno e senza segno. Come convenzione, questi nomi si trovano in un file di intestazione standard (stdint.h) e terminano con _t.

_t non ha intrinsecamente alcun significato speciale. Ma è diventato di uso comune aggiungere il i suffisso a quello di typedef.

Potresti avere più familiarità con le pratiche C comuni per la denominazione delle variabili ... Questo è simile al modo in cui è comune attaccare ap in primo piano per un puntatore e usare un trattino basso davanti alle variabili globali (questo è un po ' meno comune) e per utilizzare i nomi delle variabili j, k e BYTE per le variabili di ciclo temporaneo.

Nel codice in cui le dimensioni delle parole e l'ordinamento sono importanti, è molto comune utilizzare tipi definiti personalizzati espliciti, come WORD DWORD (normalmente 16 bit) int_t (32 bit).

int non è così buono, perché la definizione di <=> varia da piattaforma a piattaforma, quindi a chi <=> sei conforme? (Sebbene, oggigiorno, la maggior parte dello sviluppo incentrato sul PC lo consideri come 32 bit, molte cose per lo sviluppo non PC trattano ancora gli int come 16 bit).

È solo una convenzione che significa " digitare " ;. Non significa niente di speciale per il compilatore.

Significa tipo. size_t è il tipo di dimensione.

Ci sono state alcune buone spiegazioni sull'argomento. Solo per aggiungere un altro motivo per ridefinire i tipi:

In molti progetti incorporati, tutti i tipi vengono ridefiniti per indicare correttamente il dimensionamento dato ai tipi e per migliorare la portabilità su piattaforme diverse (ovvero compilatori di tipi di hardware).

Un altro motivo sarà rendere il tuo codice portatile su diversi sistemi operativi ed evitare collisioni con tipi esistenti nel sistema operativo che stai integrando nel tuo codice. Per questo, di solito viene aggiunto un prefisso univoco (possibile).

Esempio:

typedef unsigned long dc_uint32_t;

Se hai a che fare con il codice dell'interfaccia hardware, l'autore del codice che stai guardando potrebbe aver definito int_t un numero intero di dimensioni specifiche. Lo standard C non assegna una dimensione specifica al tipo int (dipende potenzialmente dal compilatore e dalla piattaforma di destinazione) e l'utilizzo di un tipo <=> specifico eviterebbe questo problema di portabilità.

Questa è una considerazione particolarmente importante per il codice dell'interfaccia hardware, che potrebbe essere il motivo per cui hai notato per la prima volta la convenzione lì.

Ad esempio in C99, /usr/include/stdint.h:

typedef unsigned char           uint8_t;
typedef unsigned short int      uint16_t;
#ifndef __uint32_t_defined
typedef unsigned int            uint32_t;
# define __uint32_t_defined
#endif
#if __WORDSIZE == 64
typedef unsigned long int       uint64_t;
#else
__extension__
typedef unsigned long long int  uint64_t;
#endif

_t significa sempre definito da typedef.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top