Ho notato che la maggior parte dei valori predefiniti in libc
sono scritti utilizzando le direttive #define
. Ad esempio, il parametro whence
prende uno in cui, a mia conoscenza, uno enum
sarebbe stato migliore. Ci sono molti esempi come questo che dovrebbero ovviamente esistere per una ragione (diversa dai problemi di retro-compatibilità).Scegliere tra enum o definire in C?
Quindi mi chiedo in che caso è meglio utilizzare #define
mentre enum
è un type-safe alternative more easily discoverable.
Come esempio pratico si consideri un typedef
che rappresenta un canale di input/output, come potrebbe essere il caso nel kernel. Il gpio può essere configurato in input o output. Vale la pena utilizzare una direttiva enum
qui?
typedef struct gpio {
size_t port;
size_t bit;
enum { DIR_INPUT, DIR_OUTPUT } direction; // or `bool`?
bool value;
} gpio;
Si noti che il enum
può essere implementato in tre diversi modi:
i) tipo:
typedef enum gpio_direction {
DIR_OUTPUT
DIR_INPUT
} gpio_direction;
ii) enum globale
enum gpio_direction {
DIR_OUTPUT
DIR_INPUT
} gpio_direction;
iii) Anonimo enum (come mostrato nel mio esempio).
un problema con 'enum' è che gli enumeratori hanno sempre tipo' int'. Non possono essere usati per valori al di fuori dell'intervallo di 'int'. Un altro potenziale problema nel codice è che la dimensione dell'enumerazione può variare tra i compilatori (o anche le compilazioni, in teoria), il pasticcio con il layout della struttura. –
Personalmente userei sempre un Enum quando il valore non ha importanza come nelle macchine a stati o nei campi conditon. In questo caso non paragono mai ENUM con int. Confronto sempre ENUM con ENUM. Nei casi in cui il valore reale è importante, utilizzerei sempre #defines. PER ESEMPIO. Valori di registro di configurazione hardware o campi Bit. – Schafwolle
Si sta chiedendo che cosa è la migliore pratica nei sistemi embedded. libc è stato scritto da programmatori desktop. Ci sono più cose da considerare per i sistemi embedded, dove è molto più importante essere espliciti con i tipi. Se non stai chiedendo specificamente i sistemi embedded, allora [questo] (http://stackoverflow.com/questions/1674032/static-const-vs-define-vs-enum) è il duplicato. Nel complesso questo argomento è stato discusso all'infinito su SO, è possibile trovare molte informazioni a riguardo. – Lundin