HOWTO · C
Come usare typedef enum in C
Questo articolo presenta come usare typedef enum in C, ne spiega i vantaggi e fornisce esempi chiari. Scopri come migliorare la leggibilità e la manutenibilità del codice con typedef enum e come usarlo nelle struct. Che tu sia un principiante o voglia perfezionare le tue competenze, questa guida ti aiuterà a orientarti tra gli enum in C con facilità.
In questa pagina
In C, un enum dichiara costanti intere con nome e typedef può assegnare al tipo enum un nome più breve. Usa i nomi per rendere più leggibili i valori di stato e di opzione, quindi gestisci tali valori in modo esplicito ogni volta che l’input o i dati memorizzati possono provenire dall’esterno del programma. Un enum migliora la chiarezza, ma non convalida automaticamente ogni valore assegnato a una variabile.
Definire un enum e assegnare valori
Un enumeratore senza un valore esplicito inizia da 0; ogni enumeratore successivo è maggiore di uno rispetto al valore precedente. Ad esempio, enum { MONDAY, TUESDAY, WEDNESDAY }; assegna 0, 1 e 2. Puoi assegnare i valori in modo esplicito quando devono corrispondere a un formato, un protocollo o un insieme stabile di codici esistente: enum Status { STATUS_READY = 1, STATUS_RUNNING = 4, STATUS_DONE = 8 };. Dopo un valore esplicito, il valore implicito successivo è maggiore di uno rispetto a quel valore.
Nomi come STATUS_READY sono costanti intere. Non sono variabili. A una variabile enum può essere assegnato un valore diverso in un secondo momento e C in genere non la limita agli enumeratori elencati nella sua dichiarazione. Considera i valori provenienti da input, file o altre fonti esterne come dati da controllare prima di usarli.
Creare un alias typedef per un enum
Un tag enum e un alias typedef sono nomi correlati ma distinti. Con enum State { ... };, una dichiarazione usa enum State. Un typedef può introdurre l’alias più breve State, consentendo dichiarazioni come State current;. L’alias si riferisce allo stesso tipo; typedef non crea un tipo distinto. La forma combinata typedef enum State { ... } State; dichiara insieme il tag e l’alias.
Questo esempio chiede un numero intero, verifica che la lettura abbia successo e convalida il valore prima di convertirlo in State e memorizzarlo nel campo di Job. Inserisci 2 per vedere il percorso di successo. Il programma stampa la richiesta e il valore ripetuto sulla stessa riga, quindi lo switch stampa Running. Se la lettura non riesce o il numero non rientra nei tre stati supportati, il programma stampa un messaggio e si ferma prima della conversione.
#include <stdio.h>
typedef enum State {
STATE_READY = 1,
STATE_RUNNING = 2,
STATE_DONE = 3
} State;
typedef struct Job {
State state;
} Job;
int main(void) {
int input;
printf("Input: ");
if (scanf("%d", &input) != 1) {
puts("Could not read an integer.");
return 0;
}
printf("%d\n", input);
if (input != STATE_READY && input != STATE_RUNNING && input != STATE_DONE) {
puts("Unsupported state.");
return 0;
}
Job job = { (State)input };
switch (job.state) {
case STATE_READY:
puts("Ready");
break;
case STATE_RUNNING:
puts("Running");
break;
case STATE_DONE:
puts("Done");
break;
default:
puts("Unsupported state.");
break;
}
return 0;
}
Input: Could not read an integer.
Usare un tipo enum in una struct
La struct Job sopra memorizza il suo stato in un campo State. In questo modo lo stato resta accanto agli altri dati che descrivono un job, mentre le costanti enum rendono leggibili assegnazioni e casi dello switch. Puoi anche dichiarare il campo con il tag come enum State state; se scegli di non definire un alias typedef.
Una struct non aggiunge alcuna convalida al campo. Se il valore proviene da una fonte che può fornire un numero non supportato, controllalo prima di farvi affidamento. Il ramo default offre al programma una risposta definita quando il valore memorizzato non corrisponde a nessuno degli stati denominati. Se una particolare applicazione richiede garanzie più rigorose, convalida al confine in cui il valore entra nel programma e mantieni tale controllo vicino all’assegnazione.
Scegliere i valori enum e usarli in sicurezza
Usa valori impliciti quando le costanti sono etichette interne e la loro rappresentazione numerica non ha importanza. Assegna i valori in modo esplicito quando un’altra interfaccia richiede numeri specifici e mantieni stabili tali assegnazioni se i dati vengono salvati o scambiati. In entrambi i casi, le costanti denominate comunicano l’intento meglio dei letterali interi privi di spiegazione e offrono a chi mantiene il codice un unico punto in cui vedere le etichette disponibili.
Questi vantaggi non rendono le variabili enum di sola lettura né garantiscono che contengano solo enumeratori denominati. Una variabile può cambiare durante l’esecuzione e un cast o un input esterno può produrre un valore privo di un nome corrispondente. Usa uno switch con un ramo default, oppure convalida il valore rispetto agli enumeratori accettati prima di elaborarlo. In questo modo si evita che dati imprevisti seguano silenziosamente un percorso destinato a uno stato noto.
In breve, dichiara l’enum per le costanti denominate, aggiungi un alias typedef quando rende le dichiarazioni più chiare e usa il tipo risultante ovunque lo stato abbia senso, inclusi i campi delle struct e i parametri delle funzioni. Scegli valori numerici espliciti solo quando i numeri fanno parte di un requisito e mantieni la convalida separata dalla comodità di denominazione offerta dagli enum.