Se faccio un `typedef` in C o C ++, quando dovrei aggiungere` _t` alla fine del tipo typedef’ed?

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.