Sono confuso quando dovrei aggiungere il _t
finale ai tipi typedef
?
Ad esempio, dovrei fare questo:
typedef struct image image_t;
o questo:
typedef struct image image;
Quali sono le regole generali?
Un altro esempio, dovrei fare questo:
typdef enum { ARRAY_CLOSED, ARRAY_OPEN, ARRAY_HALFOPEN } array_type_t;
o questo:
typdef enum { ARRAY_CLOSED, ARRAY_OPEN, ARRAY_HALFOPEN } array_type;
Per favore, illuminami.
Grazie, Boda Cydo.
In POSIX, i nomi che terminano con _t
sono riservati, quindi se stai mirando a un sistema POSIX (ad es. Linux), non devi terminare i tuoi tipi con _t
.
Personalmente disprezzo la convenzione. Finché sei coerente, non importa, comunque.
Nota che (come indicano altre risposte qui) se stai codificando su un altro standard, come POSIX, devi verificare se è ok in quello standard prima di usare tali nomi.
Quando dovrebbe usare use _t
? Mai? È riservato da uno standard principale (POSIX) e, anche se non lo è ora, il codice potrebbe essere usato un giorno in un ambiente POSIX, quindi usare _t
è una ctriggers idea.
Vorrei andare oltre per dire che l’uso eccessivo di typedef
è male in generale. Se il tuo tipo è una struct
, union
o enum
, usa queste parole chiave quando dichiari variabili e rende il tuo codice più chiaro. L’uso di typedef
è preferibile quando si desidera rendere invisibile il tipo sottostante per scopi di astrazione / incapsulamento. Alcuni grandi esempi dello standard C sono size_t
, int32_t
, mbstate_t
e lo stdio FILE
.
Alcuni dei peggiori abusi di typedef
sono l’API di Windows ( WORD
, DWORD
, INT
, LPSTR
ecc.) E glib ( gint
, gchar
, ecc.). Fare duplicati dei tipi C standard con lo stesso uso previsto è solo fonte di confusione e serve a bloccare gli sviluppatori nella tua libreria / piattaforma inquinando tutto il codice con questi nomi di tipi non standard.
Uso i suffissi per aumentare la leggibilità: _t per typedef e _e per enum da 25/30 anni … a volte uso _st quando typedef definisce una struct.
Penso che sia una buona pratica far sì che il codice sia leggibile e standardizzato, quindi trovo giusto usare i suffissi! Inoltre, ad oggi, non ho trovato alcun documento ufficiale POSIX che dichiari che il suffisso _t è riservato.
Il vecchio stdio.h contiene _t … Vedi: grep -i “_t;” stdio.h 🙂 Penso che lo standard POSIX sia “un po ‘più giovane di C!
Scegli buoni nomi per i tuoi tipi, proprio come dovresti con le tue variabili, funzioni e quant’altro. Un buon nome non contiene informazioni ridondanti che rendono più difficile la lettura del codice – non ti aiuta mai se hai un buon nome per cominciare.
A proposito: typedef image image;
non ha alcun senso, dal momento che rende l’immagine un typedef a se stessa.
Sto usando _t
suffix per enum e tipi primitivi per distinguerli dalle variabili. Li metto nei namespace, quindi non mi importa delle prenotazioni.
Per giustificarlo. Molto spesso il nome della variabile è un’allusione al tipo tipizzato. Come std::size_t size;
array_t array
ecc. Ho trovato che è più facile scegliere un nome decente per una variabile, quando il tipo contiene suffisso _t
. Mi ricorda anche che si tratta di una primitiva tipizzata e non di un’altra class come la bestia, ad esempio.