我在C头文件中发现了一些不明所以的内容。例如,在文件bits/socket.h
中,有一个枚举类型 enum __socket_type
,但是每个枚举值后面都有一个定义宏,定义了相同的内容。例如:
enum __socket_type
{
SOCK_STREAM = 1,
#define SOCK_STREAM SOCK_STREAM
...
};
我一直无法找到这是做什么的。请给我指点。我甚至不知道如何提出正确的问题来查询谷歌或此网站的搜索框。
我在C头文件中发现了一些不明所以的内容。例如,在文件bits/socket.h
中,有一个枚举类型 enum __socket_type
,但是每个枚举值后面都有一个定义宏,定义了相同的内容。例如:
enum __socket_type
{
SOCK_STREAM = 1,
#define SOCK_STREAM SOCK_STREAM
...
};
我一直无法找到这是做什么的。请给我指点。我甚至不知道如何提出正确的问题来查询谷歌或此网站的搜索框。
预处理宏永远不会递归扩展,因此这样的#define
在使用时会将名称保留在原地。当您想要进行预处理功能测试时,这些东西非常有用。
#ifdef SOCK_STREAM
..
#endif
可以用于在之后有条件地编译一些代码。
编辑:因此,它将枚举的更清晰方法(隐式值没有冲突和作用域)与预处理器测试相结合。
NUM_FILES
,他们会认为它是一个宏,并且会有写出以下代码的冲动:#ifdef NUM_FILES
通常情况下,这将失败,但如果您编写#define NUM_FILES NUM_FILES
,它会作为预处理器和IDE的宏,以及代码本身的枚举。