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

标签 c++ c gcc compiler-construction macros

<分区>

Possible Duplicate:
Double Negation in C++ code.

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

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

我不明白为什么使用 (!!(expr)) 而不是单个 (expr)。无论如何,双重否定意味着肯定,不是吗?我错过了什么吗?

最佳答案

这是一种将表达式转换为 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(); 这样的表达式。

关于c++ - 宏定义中双重否定的目的是什么,比如 (!!(expr))?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4910313/

相关文章:

C++ 等效于从 popen 读取的 fgets

c - 从文件中读取

c - 使用 STM32 进行 SPI 的 DMA 时数据无效

c++ - 完美包装一个函数

c - gcc -c 参数出现问题并设置输出文件

c++ - 使用sqlite3时内存不足

c++ - 计算 "copying a binary file in c++ on linux"消耗时间的最佳方法是什么?

C++11 vector<bool> 性能问题(附代码示例)

C - 读取换行符的末尾

c - 这种用于堆栈切换的内联汇编方法可以吗?