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

时间:2011-07-26 13:19:16

标签: c enums c-preprocessor

我在 C 标题文件中发现了一些我无法弄清楚的内容。例如,在文件bits/socket.h中有一个枚举类型 enum __socket_type,但在每个枚举器之后都有一个定义宏的定义宏。例如:

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

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

3 个答案:

答案 0 :(得分:5)

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

#ifdef NUM_FILES

现在通常这会失败,但是如果你写#define NUM_FILES NUM_FILES它就像预处理器和IDE的宏一样,并且作为代码本身的枚举。

答案 1 :(得分:4)

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

#ifdef SOCK_STREAM
..
#endif

可以用来有条件地编译一些代码。

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

答案 2 :(得分:0)

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