2011-07-26 40 views
5

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

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

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

回答

4

预处理器宏将永远不会递归地扩展,所以这样一个#define所做的就是在使用它的地方留下名称。当您想要进行预处理器功能测试时,这种功能非常有用。

#ifdef SOCK_STREAM 
.. 
#endif 

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

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

+0

确实,这是有道理的,但为什么还有枚举不仅定义? – BeginEnd

+0

@BeginEnd,请看我的编辑 –

+0

我担心你会说这个。 :P做这种“普遍”的事情往往会让我的编程生活变得更艰难...... – BeginEnd

5

我能想到的唯一的事情是因为人们看到全大写的常量,说NUM_FILES,他们会认为这是一个宏都禁不住这样写:通常

#ifdef NUM_FILES 

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

0

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