定义例外,它是如何工作的?

时间:2015-01-29 11:22:43

标签: c++ exception c-preprocessor

我应该如何理解这样的代码?特别是我想知道在'\'后的第二部分发生了什么。谁能解释一下它是如何运作的?

#define except(expression, message) (void) \
(!!(expression) || (throw std::runtime_error(message), false))

1 个答案:

答案 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可确保您不会意外地将表达式的无意义结果用作值。

尽量不要写这样的代码。