我应该如何理解这样的代码?特别是我想知道在'\'后的第二部分发生了什么。谁能解释一下它是如何运作的?
#define except(expression, message) (void) \
(!!(expression) || (throw std::runtime_error(message), false))
答案 0 :(得分:5)
这是一个采用多个语句的例子,并使用一些语言规则将其压缩成难以理解的单个语句。
代码等同于:
#define except(expression, message) \
if (!!(expression)) {} \
else { \
throw std::runtime_error(message); \
}
只有当LHS评估为||
时,false
才会利用短路来评估RHS。
!!
is a trick有助于确保结果是布尔值,或至少类似布尔值。传统上,某些用户定义的类型不会自动转换为bool
,但会提供operator!
;第二次应用它可以消除operator!
暗示的自然否定。在内置类型(例如整数类型)的情况下,它可以被视为只是(无意义)显式转换为bool
。
, false
利用逗号运算符的倾向,使得结果表达式具有其RHS最多操作数的类型。您希望表达式的类型为bool
,以便它可以应用于||
运算符,而throw
- 表达式的类型为void
,因此{{ 1}}纠正了这一点。
强制转换, false
可确保您不会意外地将表达式的无意义结果用作值。
尽量不要写这样的代码。