定义异常,它是如何工作的?
Defining exceptions, how does it work?
我应该如何理解这样的代码?特别是我想知道在'\'之后的第二部分发生了什么。谁能解释一下它是如何工作的?
#define except(expression, message) (void) \
(!!(expression) || (throw std::runtime_error(message), false))
这是一个例子,它使用一些语言规则将应该是多个语句的东西压缩成一个难以理解的单个语句。
代码等同于:
#define except(expression, message) \
if (!!(expression)) {} \
else { \
throw std::runtime_error(message); \
}
||
利用 短路 仅当 LHS 计算为 false
.
时才计算 RHS
!!
is a trick 有助于确保结果是布尔值,或者至少是布尔值。传统上,某些用户定义的类型不会自动转换为 bool
,但会提供一个 operator!
;第二次应用它会撤消 operator!
暗示的自然否定。在内置类型(例如整数类型)的情况下,它可能被认为只是对 bool
.
的(无意义的)显式转换。
, false
利用逗号运算符的特性使结果表达式具有其最右手操作数的类型。您希望表达式的类型为 bool
,以便它可以应用于 ||
运算符,而 throw
表达式的类型为 void
,因此 , false
对此进行更正。
转换 (void)
确保您不会意外地将表达式的无意义结果用作值。
尽量不要这样写代码。
我应该如何理解这样的代码?特别是我想知道在'\'之后的第二部分发生了什么。谁能解释一下它是如何工作的?
#define except(expression, message) (void) \
(!!(expression) || (throw std::runtime_error(message), false))
这是一个例子,它使用一些语言规则将应该是多个语句的东西压缩成一个难以理解的单个语句。
代码等同于:
#define except(expression, message) \
if (!!(expression)) {} \
else { \
throw std::runtime_error(message); \
}
||
利用 短路 仅当 LHS 计算为 false
.
!!
is a trick 有助于确保结果是布尔值,或者至少是布尔值。传统上,某些用户定义的类型不会自动转换为 bool
,但会提供一个 operator!
;第二次应用它会撤消 operator!
暗示的自然否定。在内置类型(例如整数类型)的情况下,它可能被认为只是对 bool
.
, false
利用逗号运算符的特性使结果表达式具有其最右手操作数的类型。您希望表达式的类型为 bool
,以便它可以应用于 ||
运算符,而 throw
表达式的类型为 void
,因此 , false
对此进行更正。
转换 (void)
确保您不会意外地将表达式的无意义结果用作值。
尽量不要这样写代码。