Domanda Differenza tra Enum e Definisci dichiarazioni


Qual è la differenza tra l'uso di una dichiarazione define e di una dichiarazione enum in C / C ++ (e c'è qualche differenza quando li usi con C o C ++)?

Ad esempio, quando si dovrebbe usare

enum {BUFFER = 1234}; 

al di sopra di

#define BUFFER 1234   

44
2017-09-25 23:47


origine


risposte:


enum definisce un elemento sintattico.

#define è una direttiva pre-preprocessore, eseguita prima il compilatore vede il codice e quindi non è un elemento di linguaggio di C stesso.

Generalmente le enumerazioni sono preferite in quanto sono sicure per tipo e più facilmente individuabili. Le definizioni sono più difficili da individuare e possono avere un comportamento complesso, ad esempio una parte di codice può ridefinire a #define fatto da un altro. Questo può essere difficile da rintracciare.


55
2017-09-25 23:48



#define le istruzioni sono gestite dal pre-processore prima che il compilatore possa vedere il codice, quindi è fondamentalmente una sostituzione di testo (in realtà è un po 'più intelligente con l'uso di parametri e così via).

Le enumerazioni fanno parte del linguaggio C stesso e presentano i seguenti vantaggi.

1 / Potrebbero avere il tipo e il compilatore può scriverli.

2 / Dal momento che sono disponibili per il compilatore, le informazioni sui simboli su di esse possono essere passate al debugger, rendendo più facile il debugging.


14
2017-09-25 23:58



Definisci è un comando per il preprocessore, è come fare "sostituisci tutto" nel tuo editor, può sostituire una stringa con un'altra e quindi compilare il risultato.

Enum è un caso speciale di tipo, ad esempio, se scrivi:

enum ERROR_TYPES
{
   REGULAR_ERR =1,
   OK =0
}

esiste un nuovo tipo chiamato ERROR_TYPES. È vero che REGULAR_ERR restituisce 1 ma il cast da questo tipo a int dovrebbe produrre un avviso di cast (se si configura il compilatore con un livello di dettaglio elevato).

Sommario: sono entrambi uguali, ma quando si usa enum si guadagna il controllo del tipo e usando definisce semplicemente si sostituiscono le stringhe di codice.


8
2017-09-25 23:53



Le enumerazioni sono generalmente preferite su #define, ovunque abbia senso usare un enum:

  • I debugger possono mostrarti il ​​nome simbolico di un enums valore ("openType: OpenExisting", piuttosto che "openType: 2"
  • Ottieni un po 'più di protezione dalle interferenze dei nomi, ma non è così male come lo è stato (la maggior parte dei compilatori avvisa di re#defineition.

La più grande differenza è che puoi usare enum come tipi:

// Yeah, dumb example
enum OpenType {
    OpenExisting,
    OpenOrCreate,
    Truncate
};

void OpenFile(const char* filename, OpenType openType, int bufferSize);

Questo ti dà il controllo dei parametri (non puoi mescolare openType e bufferSize con la stessa facilità), e rende facile trovare quali valori sono validi, rendendo le tue interfacce molto più facili da usare. Alcuni IDE possono persino darti intellisense completamento del codice!


5
2017-09-26 00:26



È sempre meglio usare un enum se possibile. L'uso di una enumerazione fornisce al compilatore maggiori informazioni sul codice sorgente, una definizione del preprocessore non viene mai vista dal compilatore e quindi contiene meno informazioni.

Per implementare per es. un sacco di modi, usando un enum rende possibile che il compilatore rimanga nascosto case-statiments in un interruttore, per esempio.


4
2018-06-14 07:28



enum può raggruppare più elementi in una categoria:

enum fruits{ apple=1234, orange=12345};

mentre #define può solo creare costanti non correlate:

#define apple 1234
#define orange 12345

3
2018-06-14 07:34



#define è un comando per il preprocessore, enum è in linguaggio C o C ++.

È sempre meglio usare enum su #define per questo tipo di casi. Una cosa è la sicurezza del tipo. Un altro è che quando hai una sequenza di valori devi solo dare l'inizio della sequenza nell'enum, gli altri valori ottengono valori consecutivi.

enum {
  ONE = 1,
  TWO,
  THREE,
  FOUR
};

invece di

#define ONE 1
#define TWO 2
#define THREE 3
#define FOUR 4

Come nota a margine, ci sono ancora alcuni casi in cui potresti dover usare #define (tipicamente per alcuni tipi di macro, se devi essere in grado di costruire un identificatore che contiene la costante), ma è una sorta di magia nera a macroistruzione e molto molto raro essere la strada da percorrere. Se vai a queste estremità probabilmente dovresti usare un modello C ++ (ma se sei bloccato con C ...).


3
2018-06-14 07:38