Mar*_*z W 1 c++ exception c-preprocessor
我应该如何理解这样的代码?特别是我想知道在'\'后的第二部分发生了什么.任何人都可以解释一下它是如何工作的?
#define except(expression, message) (void) \
(!!(expression) || (throw std::runtime_error(message), false))
Run Code Online (Sandbox Code Playgroud)
这是一个应该是多个语句的例子,并使用一些语言规则将它压缩成难以理解的单个语句.
代码等同于:
#define except(expression, message) \
if (!!(expression)) {} \
else { \
throw std::runtime_error(message); \
}
Run Code Online (Sandbox Code Playgroud)
在||需要的优势短路评价RHS只有在LHS计算结果为false.
这!!是一个帮助确保结果是布尔值或至少类似布尔值的技巧.传统上,一些用户定义的类型不会自动转换为bool,但确实提供了一个operator!; 第二次应用它可以解除隐含的自然否定operator!.在内置类型(例如整数类型)的情况下,它可以被认为是(无意义的)显式转换bool.
在, false采用逗号操作的倾向的优势,导致生成的表达有其RHS-大部分操作数的类型.您希望表达式的类型bool可以应用于||运算符,并且throw-expression具有类型void,因此, false更正了该类型.
演员表(void)确保您不会意外地将表达式的无意义结果用作值.
尽量不要写这样的代码.
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |