“ #define X X”是什么意思?

问题描述 投票:5回答:3

在Linux头文件epoll.h中,我找到了以下代码:

enum EPOLL_EVENTS
{
    EPOLLIN = 0x001,
#define EPOLLIN EPOLLIN
...
}

#define EPOLLIN EPOLLIN是什么意思?

c++ c linux c-preprocessor idioms
3个回答
1
投票
#define EPOLLIN EPOLLIN

这将预处理程序宏EPOLLIN定义为EPOLLIN

可能是为了以后的#ifdef EPOLLIN检查而定义的。


0
投票
这是预处理器检查哪些事件代码可用并根据需要有条件地编译代码的一种方法。

如果进入glibc的git repo并查看git blame的输出,我们将看到enum EPOLL_EVENTS的以下内容:

ad3bf20c (Ulrich Drepper 2002-12-16 23:38:42 +0000 34) enum EPOLL_EVENTS ad3bf20c (Ulrich Drepper 2002-12-16 23:38:42 +0000 35) { ad3bf20c (Ulrich Drepper 2002-12-16 23:38:42 +0000 36) EPOLLIN = 0x001, ad3bf20c (Ulrich Drepper 2002-12-16 23:38:42 +0000 37) #define EPOLLIN EPOLLIN ad3bf20c (Ulrich Drepper 2002-12-16 23:38:42 +0000 38) EPOLLPRI = 0x002, ad3bf20c (Ulrich Drepper 2002-12-16 23:38:42 +0000 39) #define EPOLLPRI EPOLLPRI ad3bf20c (Ulrich Drepper 2002-12-16 23:38:42 +0000 40) EPOLLOUT = 0x004, ad3bf20c (Ulrich Drepper 2002-12-16 23:38:42 +0000 41) #define EPOLLOUT EPOLLOUT ad3bf20c (Ulrich Drepper 2002-12-16 23:38:42 +0000 42) EPOLLRDNORM = 0x040, ad3bf20c (Ulrich Drepper 2002-12-16 23:38:42 +0000 43) #define EPOLLRDNORM EPOLLRDNORM ad3bf20c (Ulrich Drepper 2002-12-16 23:38:42 +0000 44) EPOLLRDBAND = 0x080, ad3bf20c (Ulrich Drepper 2002-12-16 23:38:42 +0000 45) #define EPOLLRDBAND EPOLLRDBAND ad3bf20c (Ulrich Drepper 2002-12-16 23:38:42 +0000 46) EPOLLWRNORM = 0x100, ad3bf20c (Ulrich Drepper 2002-12-16 23:38:42 +0000 47) #define EPOLLWRNORM EPOLLWRNORM ad3bf20c (Ulrich Drepper 2002-12-16 23:38:42 +0000 48) EPOLLWRBAND = 0x200, ad3bf20c (Ulrich Drepper 2002-12-16 23:38:42 +0000 49) #define EPOLLWRBAND EPOLLWRBAND ad3bf20c (Ulrich Drepper 2002-12-16 23:38:42 +0000 50) EPOLLMSG = 0x400, ad3bf20c (Ulrich Drepper 2002-12-16 23:38:42 +0000 51) #define EPOLLMSG EPOLLMSG ad3bf20c (Ulrich Drepper 2002-12-16 23:38:42 +0000 52) EPOLLERR = 0x008, ad3bf20c (Ulrich Drepper 2002-12-16 23:38:42 +0000 53) #define EPOLLERR EPOLLERR 5e826ab5 (Ulrich Drepper 2003-03-25 01:14:36 +0000 54) EPOLLHUP = 0x010, ad3bf20c (Ulrich Drepper 2002-12-16 23:38:42 +0000 55) #define EPOLLHUP EPOLLHUP 94833f11 (Ulrich Drepper 2007-10-28 01:34:10 +0000 56) EPOLLRDHUP = 0x2000, 94833f11 (Ulrich Drepper 2007-10-28 01:34:10 +0000 57) #define EPOLLRDHUP EPOLLRDHUP 981569c7 (Joseph Myers 2016-03-14 19:04:53 +0000 58) EPOLLEXCLUSIVE = 1u << 28, 981569c7 (Joseph Myers 2016-03-14 19:04:53 +0000 59) #define EPOLLEXCLUSIVE EPOLLEXCLUSIVE f8d44fdc (Andreas Jaeger 2012-07-26 13:11:33 +0200 60) EPOLLWAKEUP = 1u << 29, f8d44fdc (Andreas Jaeger 2012-07-26 13:11:33 +0200 61) #define EPOLLWAKEUP EPOLLWAKEUP 4920765e (Ulrich Drepper 2011-12-21 22:14:05 -0500 62) EPOLLONESHOT = 1u << 30, e11676dd (Ulrich Drepper 2004-01-21 06:23:26 +0000 63) #define EPOLLONESHOT EPOLLONESHOT 4920765e (Ulrich Drepper 2011-12-21 22:14:05 -0500 64) EPOLLET = 1u << 31 5e826ab5 (Ulrich Drepper 2003-03-25 01:14:36 +0000 65) #define EPOLLET EPOLLET ad3bf20c (Ulrich Drepper 2002-12-16 23:38:42 +0000 66) };

从这里,您可以看到大多数这些事件是2002年创建的,但后来又添加了许多其他事件。因此,这些宏允许您检查特定标志是否可用,如下所示:

#ifdef EPOLLEXCLUSIVE /* code that can handle EPOLLEXCLUSIVE */ #else /* code that uses an alternate event */ #endif

这样,代码可以在具有可用新事件的较新Linux版本上运行,也可以在不具有较新版本的旧版本上运行。    

-1
投票
第一个EPOLLIN是宏的名称。第二个指向枚举成员。现在,无论何时使用EPOLLIN,编译器都会用EPOLL_EVENTS枚举中的EPOLLIN替换它。

这是一个简单的名称相似性。他们可以简单地使用任何其他名称来代替第一个EPOLLIN。

© www.soinside.com 2019 - 2024. All rights reserved.