使用 #define 重新定义枚举变量的枚举值

7

我在C头文件中发现了一些不明所以的内容。例如,在文件bits/socket.h中,有一个枚举类型 enum __socket_type,但是每个枚举值后面都有一个定义宏,定义了相同的内容。例如:

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

我一直无法找到这是做什么的。请给我指点。我甚至不知道如何提出正确的问题来查询谷歌或此网站的搜索框。

3个回答

6

预处理宏永远不会递归扩展,因此这样的#define在使用时会将名称保留在原地。当您想要进行预处理功能测试时,这些东西非常有用。

#ifdef SOCK_STREAM
..
#endif

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

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


确实,这很有道理,但为什么除了定义之外还有枚举? - BeginEnd
我害怕你会这么说。:P 做这样“通用”的事情经常让我的编程生活更加困难... - BeginEnd

5
我唯一能想到的原因是,因为人们看到一个全大写的常量,比如NUM_FILES,他们会认为它是一个宏,并且会有写出以下代码的冲动:
#ifdef NUM_FILES

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


0
我猜测这是为了让IDE或其他工具理解某个符号以某种方式被定义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接