使用#define重新定义枚举枚举器

Beg*_*End 5 c enums c-preprocessor

我在C头文件中发现了一些我无法弄清楚是什么的东西.例如,在文件中bits/socket.h有一个枚举类型 enum __socket_type,但在每个枚举器之后都有一个定义宏的定义宏.例:

enum __socket_type
{
   SOCK_STREAM = 1,
   #define SOCK_STREAM SOCK_STREAM 
   ...
};
Run Code Online (Sandbox Code Playgroud)

我一直无法知道这是为了什么.请赐教.我甚至不知道如何形成正确的问题来查询谷歌或这个网站搜索框.

Jen*_*edt 6

预处理器宏永远不会递归扩展,因此无论在#define何处使用它,都将名称保留在原处。当您想要进行预处理器功能测试时,这些东西很有用。

#ifdef SOCK_STREAM
..
#endif
Run Code Online (Sandbox Code Playgroud)

可用于之后有条件地编译一些代码。

编辑:因此,这将更简洁的枚举方法(没有冲突和范围的隐式值)与预处理器测试相结合。


orl*_*rlp 5

我能想到的唯一一件事就是因为人们看到全部大写的一个常数,比如说NUM_FILES,他们认为这是一个宏,并且很想写这个:

#ifdef NUM_FILES
Run Code Online (Sandbox Code Playgroud)

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