【问题标题】:Statement in C++ macroC++ 宏中的语句
【发布时间】:2015-06-01 14:52:51
【问题描述】:

阅读 chromium 代码,发现在 POSIX 兼容系统上处理系统调用的 EINTR errno 有用的宏。 以下是代码(base/posix/eintr_wrapper.h):

#define HANDLE_EINTR(x) ({ \
  decltype(x) eintr_wrapper_result; \
  do { \
    eintr_wrapper_result = (x); \
  } while (eintr_wrapper_result == -1 && errno == EINTR); \
  eintr_wrapper_result; \
})

问题是宏 eintr_wrapper_result; 中最后一条语句的作用是什么? 如果我们使用逗号而不是分号 - 很明显 - 返回最后一次操作的结果(逗号运算符)。但是这种情况的目的是什么?

【问题讨论】:

标签: c++ c macros c-preprocessor


【解决方案1】:

此宏使用Statement-Expressions GCC 扩展。内部块中的最后一个表达式作为整体的值,一旦它被执行,就像逗号运算符一样。

【讨论】:

  • 为了兴趣,何不直接用逗号?
  • @simonwo 因为do{}while() 不是表达式,因此不能是逗号运算符的操作数。
猜你喜欢
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多