Qual è lo scopo di questi #define all’interno di un enum?

Ho trovato questo codice nelle intestazioni di Linux, /usr/include/dirent.h:

enum { DT_UNKNOWN = 0, # define DT_UNKNOWN DT_UNKNOWN DT_FIFO = 1, # define DT_FIFO DT_FIFO DT_CHR = 2, # define DT_CHR DT_CHR DT_DIR = 4, # define DT_DIR DT_DIR DT_BLK = 6, # define DT_BLK DT_BLK DT_REG = 8, # define DT_REG DT_REG DT_LNK = 10, # define DT_LNK DT_LNK DT_SOCK = 12, # define DT_SOCK DT_SOCK DT_WHT = 14 # define DT_WHT DT_WHT }; 

A cosa serve questo costrutto? – perché definire qualcosa con una stringa identica, che verrà poi compilata al valore int?

La mia ipotesi è che qualche altro codice possa quindi verificare se uno (o più) di questi valori enum è stato definito usando #ifdef.

Oltre alle altre risposte che sono molto buone – vorrei andare con loro per il motivo principale – il compilatore potrebbe generare avvertimenti o errori se si tenta di ridefinire DT_UNKNOWN .

La mia ipotesi (non istruita) è che le istruzioni #define consentono ai test condizionali di vedere se la costante è stata definita.

Per esempio:

 #ifdef DT_UNKNOWN // do something #endif 

Penso che la risposta di Luchian Grigore fosse corretta.

Il codice senza definisce:

 #include  // Defined somewhere in headers #define DT_UNKNOWN 0 enum { DT_UNKNOWN = 0, DT_FIFO = 1, }; int main(int argc, char **argv) { printf("DT_UNKNOWN is %d\n", DT_UNKNOWN); return 0; } 

Dall’output del compilatore non è chiaro il motivo per cui alcune righe di codice all’interno di enum non vogliono essere compilate:

 [email protected]:~/tmp$ gcc -Wall ./main.c ./main.c:7: error: expected identifier before numeric constant 

Dopo aver aggiunto tali definizioni:

 #include  // Defined somewhere in headers #define DT_UNKNOWN 0 enum { DT_UNKNOWN = 0, # define DT_UNKNOWN DT_UNKNOWN DT_FIFO = 1, # define DT_FIFO DT_FIFO }; int main(int argc, char **argv) { printf("DT_UNKNOWN is %d\n", DT_UNKNOWN); return 0; } 

Il compilatore ci direbbe che DT_UNKNOWN è ridefinito e un luogo dove viene ridefinito:

 [email protected]:~/tmp$ gcc -Wall ./main2.c ./main2.c:7: error: expected identifier before numeric constant ./main2.c:8:1: warning: "DT_UNKNOWN" redefined ./main2.c:3:1: warning: this is the location of the previous definition 

Ho usato -dD argomenti -E e -dD (e anche -fdump-tree-all ) in gcc per vedere l’output del preprocessore e non ho trovato nulla di utile. Quindi immagino che questo codice non abbia alcuna funzionalità se non quella di visualizzare i nomi simbolici durante il debug usando un debugger come gdb .