C 使用#define重新定义枚举数

C 使用#define重新定义枚举数,c,enums,c-preprocessor,C,Enums,C Preprocessor,我在C头文件中发现了一些我无法理解的东西。例如,在文件bits/socket.h中有一个枚举类型enum\uu socket\u type,但在每个枚举器之后都有一个定义相同类型的define宏。例如: enum __socket_type { SOCK_STREAM = 1, #define SOCK_STREAM SOCK_STREAM ... }; 我一直不知道这是干什么用的。请开导我。我甚至不知道如何在查询谷歌和这个网站搜索框时提出正确的问题。我能想到的唯一一件事是

我在C头文件中发现了一些我无法理解的东西。例如,在文件
bits/socket.h
中有一个枚举类型
enum\uu socket\u type
,但在每个枚举器之后都有一个定义相同类型的define宏。例如:

enum __socket_type
{
   SOCK_STREAM = 1,
   #define SOCK_STREAM SOCK_STREAM 
   ...
};

我一直不知道这是干什么用的。请开导我。我甚至不知道如何在查询谷歌和这个网站搜索框时提出正确的问题。

我能想到的唯一一件事是,因为人们在所有大写字母中看到一个常量,比如说
NUM\u文件,他们会认为这是一个宏,并试图写下以下内容:

#ifdef NUM_FILES

现在,这通常会失败,但如果您编写
#define NUM_FILES NUM_FILES
,它将作为预处理器和IDE的宏以及代码本身的枚举。

我怀疑IDE或其他工具应该理解符号是以某种方式定义的

预处理器宏永远不会递归展开,因此这样的
#define
所做的就是将名称保留在使用它的地方。当您想要进行预处理器特性测试时,这些功能非常有用

#ifdef SOCK_STREAM
..
#endif
可以用于以后有条件地编译某些代码


编辑:因此,这将更干净的枚举方法(没有冲突和作用域的隐式值)与预处理器测试结合起来。

的确,这是有道理的,但为什么还有枚举不仅定义?恐怕你会这么说:P做这些“通用”的事情通常会让我的编程生活更加困难。。。