我在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/

10-13 09:49