像几乎所有自重的项目一样,我自己的项目也具有在 Debug模式下检查某些条件的宏:

#ifndef NDEBUG
#  define DCHECK(x) if (!(x)) { ... }
#else
#  define DCHECK(x)
#endif

但是现在我想DCHECK()一些复杂的条件,例如文件权限:
...
auto has_permissions = [fd] {
  struct stat st;
  if (fstat(fd, &st) == 0) {
    return (st.st_mode & (S_IRUSR | S_IWUSR)) == (S_IRUSR | S_IWUSR);
  }
  return false;
};
DCHECK(has_permissions());
...

另外,我也不想用除了唯一的DCHECK()以外没有使用过的lambda污染我的代码,因为在Release模式下,它们将被标记为未使用的变量。

因此,问题是:是否存在一种紧凑的方式来编写DCHECK()语句来声明,运行和检查任何复杂条件?

P.S. 使用lambda不是强制性的-这只是我的建议。

P.P.S.可以重新实现 DCHECK(),但是所有现有的调用都应该可以正常工作,而无需进行修改。

最佳答案

DCHECK宏中定义lambda并调用它

DCHECK(([]{ return false; }()));
//                         ^^

Live demo

关于c++ - 如何在C++ 11的单个表达式中声明'n'run lambda?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24837196/

10-13 04:58