在enum中定义这些#define的目的是什么?

我在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 }; 

这是什么构造? – 为什么定义一个相同的string,然后将编译为int值的东西?

我的猜测是,其他代码可以检查是否有一个(或更多)这些枚举值已经使用#ifdef定义。

除了非常好的其他答案 – 我会与他们主要原因 – 如果您尝试重新定义DT_UNKNOWN编译器可能会产生警告或错误。

我的(未受教育的)猜测是#define语句允许条件testing查看常量是否已被定义。

例如:

 #ifdef DT_UNKNOWN // do something #endif 

我认为Luchian Grigore的回答是正确的。

没有定义的代码:

 #include <stdio.h> // 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; } 

从编译器的输出,不清楚为什么在枚举内部的一些代码行不想构build:

 alexander@ubuntu-10:~/tmp$ gcc -Wall ./main.c ./main.c:7: error: expected identifier before numeric constant 

我们添加这样的定义之后:

 #include <stdio.h> // 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; } 

编译器会告诉我们,DT_UNKNOWN被重新定义,并被重新定义:

 alexander@ubuntu-10:~/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 

我在gcc使用了-E-dD参数(还有-fdump-tree-all )来查看预处理器的输出结果,结果没有任何用处。 所以我猜这个代码没有任何function,除了在使用像gdb这样的debugging器进行debugging时显示符号名称。