“定义X”是什么意思?

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

枚举EPOLL\u事件
{
环氧青霉素=0x001,
#定义EPOLLIN EPOLLIN

}

什么是#定义EPOLLIN EPOLLIN

这将创建一个名为EPOLLIN的宏,其替换文本也是EPOLLIN

这很可能是预处理器检查哪些事件代码可用并根据需要有条件编译代码的一种方法。如果我们转到glibc的git repo并查看git dull的输出,我们会看到enum EPOLL_事件的以下内容:

ad3bf20c(Ulrich Drepper 2002-12-16 23:38:42+0000 34)枚举EPOLL\u事件
ad3bf20c(Ulrich Drepper 2002-12-16 23:38:42+0000 35){
ad3bf20c(Ulrich Drepper 2002-12-16 23:38:42+0000 36)环氧青霉素=0x001,
ad3bf20c(Ulrich Drepper 2002-12-16 23:38:42+0000 37)#定义环氧青霉素
ad3bf20c(Ulrich Drepper 2002-12-16 23:38:42+0000 38)EPOLLPRI=0x002,
ad3bf20c(Ulrich Drepper 2002-12-16 23:38:42+0000 39)#定义EPOLLPRI EPOLLPRI
ad3bf20c(Ulrich Drepper 2002-12-16 23:38:42+0000 40)EPOLOUT=0x004,
ad3bf20c(Ulrich Drepper 2002-12-16 23:38:42+0000 41)#定义EPOLOUT EPOLOUT
ad3bf20c(Ulrich Drepper 2002-12-16 23:38:42+0000 42)ePollRDorm=0x040,
ad3bf20c(Ulrich Drepper 2002-12-16 23:38:42+0000 43)#定义epollrdorm epollrdorm
ad3bf20c(Ulrich Drepper 2002-12-16 23:38:42+0000 44)EPOLLRDBAND=0x080,
ad3bf20c(Ulrich Drepper 2002-12-16 23:38:42+0000 45)#定义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)#定义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)#定义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)#定义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)#定义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)#定义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)#定义epollhup epollhup
981569c7(Joseph Myers 2016-03-14 19:04:53+0000 58)ePolleExclusive=1u<<28,
981569c7(Joseph Myers 2016-03-14 19:04:53+0000 59)#定义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+020061)#定义EPOLLWAKEUP EPOLLWAKEUP
4920765e(Ulrich Drepper 2011-12-21 22:14:05-0500 62)埃波洛涅肖=1u<<30,
e11676dd(Ulrich Drepper 2004-01-21 06:23:26+0000 63)#定义epolonneshot epolonneshot
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)———定义EPOLLET EPOLLET
ad3bf20c(Ulrich Drepper 2002-12-16 23:38:42+0000 66)};

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

#ifdef epolleexclusive
/*可以处理ePolleExclusive的代码*/
#否则
/*使用备用事件的代码*/
#恩迪夫

通过这种方式,代码可以在具有较新事件的较新Linux版本上运行,也可以在没有可用事件的较旧版本上运行

发表评论