我在C中使用switch表达式来评估errno变量。根据send()
的手册页:
EAGAIN或EWOULDBLOCK
由于我的应用程序必须是可移植的,因此我必须执行以下操作:
switch (errno):
case EWOULDBLOCK:
case EAGAIN:
//do whatever
break;
case EINTR:
//...
问题在于,对于某些平台,EWOULDBLOCK和EAGAIN确实具有相同的值,因此在编译时得到:
因此,我认为我可以使用一个宏宏,具体取决于平台的EWOULDBLOCK和EAGAIN是否具有相同的值,以便将该行添加到代码中还是省略它。
关于如何编写该宏的任何想法吗?
最佳答案
就像是:
#if EAGAIN != EWOULDBLOCK
case EAGAIN:
#endif
case EWOULDBLOCK:
编辑:但是,如果您要有许多switch switch语句,则宏将比条件编译好。就像是:
#if EAGAIN == EWOULDBLOCK
#define MY_AGAIN EAGAIN
#else
#define MYAGAIN EAGAIN: case EWOULDBLOCK
#endif
然后使用它:
case MY_AGAIN:
您会发现冒号在它被调用的那一刻不属于宏:
case ---->MACRO GOES HERE<-----:
但是,在第二种情况下,当在原始周围文本的上下文中进行扩展时:
case EAGAIN: case EWOULDBLOCK:
如果它是在switch语句中显式编写的,那是非常丑陋的,但它完全是合法的C代码。
关于c - 宏,以避免重复的案例值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27509061/