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).无论如何,双重否定意味着积极,不是吗?我错过了什么吗?
这是一种将表达式强制转换为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();.
| 归档时间: |
|
| 查看次数: |
2656 次 |
| 最近记录: |