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

Fan*_*Fan 7 c c++ compiler-construction macros gcc

可能重复:
C++代码中的双重否定.

我正在阅读代码库,并找到这样的东西:

#define uassert(msgid, msg, expr) (void)((!!(expr))||(uasserted(msgid, msg), 0))
Run Code Online (Sandbox Code Playgroud)

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

Max*_*kin 6

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

0 != (expr)
Run Code Online (Sandbox Code Playgroud)

仅限C++方式:

static_cast<bool>(expr)
Run Code Online (Sandbox Code Playgroud)

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

#define uassert(expr) if(expr) {} else { uasserted(...); }
Run Code Online (Sandbox Code Playgroud)

这里,仅使用转换expr为bool.在else需要分支从般的表情保护uassert(x) else something_else();.