7

在linux内核源代码中,我看到在枚举内部,还有一个与枚举元素同名的定义。linux/rtnetlink.h我们有示例:

enum {
        RTM_BASE        = 16,
#define RTM_BASE        RTM_BASE

        RTM_NEWLINK     = 16,
#define RTM_NEWLINK     RTM_NEWLINK
        RTM_DELLINK,
#define RTM_DELLINK     RTM_DELLINK
...

这是什么原因?我无法弄清楚这是如何使用的。

谢谢

4

3 回答 3

5

我能想到的一件事是,您可以通过宏检查枚举是否存在:

#ifdef RTM_BASE
int flag = RTMBASE;
#else
int flag = 0;
#endif

不过,不知道这是否是怎么回事。

于 2012-10-02T10:38:31.560 回答
4

这些s实现的另一件事#define,除了允许旧代码在枚举常量名称被更改时继续旧名称,并检查它们是否被定义之外,是防止其他代码定义这些符号。

#include <linux/rtnetlink.h>
// for some reason, the author thinks
#define RTM_BASE 17.3f
// is a good idea

不会编译。

于 2012-10-02T13:40:50.500 回答
2

另一个猜测:这个宏可以允许在不破坏其他代码的情况下重命名枚举的条目。改变

enum {
        RTM_BASE        = 16,
#define RTM_BASE        RTM_BASE

enum {
        RTM_BASE_NEW_NEW_NEW        = 16,
#define RTM_BASE        RTM_BASE_NEW_NEW_NEW

用户仍然可以使用RTM_BASE.

于 2012-10-02T11:45:35.453 回答