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

发布于 2024-10-16 04:59:54 字数 418 浏览 5 评论 0原文

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

我正在阅读代码库,发现类似这样的内容:

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

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

Possible Duplicate:
Double Negation in C++ code.

I'm reading a code base, and find something like this:

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

I cannot figure out why (!!(expr)) is used instead of a single (expr). Anyway, a double negative means positive, is not it? Am I missing something?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

天煞孤星 2024-10-23 04:59:54

这是一种将表达式转换为 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 分支来防止诸如 uasert(x) else Something_else(); 之类的表达式。

It is a way to cast an expression to bool. In C++ though, operator! can be overloaded. Another way for C/C++:

0 != (expr)

C++ only way:

static_cast<bool>(expr)

[Edit]
Thinking more about C++ operator overloading, it make sense to avoid using operators. Libraries like Boost.Spirit and Boost.Lambda use expression templates and lazy evaluation, so that expressions like (expr) || call() may behave not as expected. The most bullet proof version of that macro looks like this:

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

Here, only conversion of expr to bool is used. The else branch is needed to protect from expressions like uassert(x) else something_else();.

她比我温柔 2024-10-23 04:59:54

它只是确保宏的 expr 部分转换为布尔值。

It will just make sure that the expr part of the macro is converted to a bool.

夏雨凉 2024-10-23 04:59:54

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

It is an idiom sometimes used in C++ for converting to a boolean type.

大海や 2024-10-23 04:59:54

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

In the example you showed us, the !! is utterly useless. However, in general it's used as a pre-C99 rough equivalent to casting to _Bool, i.e. 0 stays 0 and any other value becomes 1.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文