宏定义中双重否定的目的是什么,如(!!(expr))?

时间:2011-02-05 23:08:26

标签: c++ c gcc compiler-construction macros

  

可能重复:
  Double Negation in C++ code.

我正在阅读代码库,并找到类似的内容:

#define uassert(msgid, msg, expr) (void)((!!(expr))||(uasserted(msgid, msg), 0))

我无法弄清楚为什么使用(!!(expr))而不是单个(expr)。无论如何,双重否定意味着积极,不是吗?我错过了什么吗?

4 个答案:

答案 0 :(得分:6)

这是一种将表达式强制转换为bool的方法。但是在C ++中,运算符!可以超载。 C / C ++的另一种方式:

0 != (expr)

仅限C ++:

static_cast<bool>(expr)

<强> [编辑] 更多地考虑C ++运算符重载,避免使用运算符是有意义的。像Boost.Spirit和Boost.Lambda这样的库使用表达式模板和延迟评估,因此像(expr) || call()这样的表达式可能表现不像预期的那样。该宏的最防弹版本如下所示:

#define uassert(expr) if(expr) {} else { uasserted(...); }

此处,仅使用expr到bool的转换。需要else分支来保护uassert(x) else something_else();等表达式。

答案 1 :(得分:1)

它只会确保宏的expr部分转换为bool。

答案 2 :(得分:1)

有时在C ++中用于转换为布尔类型的习惯用法。

答案 3 :(得分:0)

在你向我们展示的例子中,!!完全没用。但是,一般来说,它被用作前C99粗略等效于转换为_Bool,即0保持为0,任何其他值变为1。