c++ - 定义异常,它是如何工作的?

标签 c++ exception c-preprocessor

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

#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 值,或者至少是 bool 值。传统上,一些用户定义的类型不会自动转换为 bool,但会提供一个 operator!;第二次应用它会撤消 operator! 暗示的自然否定。在内置类型(例如整数类型)的情况下,它可能被认为只是对 bool 的(无意义的)显式转换。

, false 利用逗号运算符的特性使结果表达式具有其最右手操作数的类型。您希望表达式的类型为 bool 以便它可以应用于 || 运算符,并且 throw 表达式具有类型void,因此 , false 对此进行了更正。

强制转换 (void) 确保您不会意外地将表达式的无意义结果用作值。

尽量不要写这样的代码。

关于c++ - 定义异常,它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28213480/

相关文章:

Java unchecked/checked 异常说明

c - 如何为预处理器创建变量值 channel ?

c++ - 通过用最后一个元素替换它然后删除它来从 vector 中删除一个元素是否会使过程更快?

c++ - 来自 stdin 的 Cin 是一行的结尾

Java异常的正确使用和代价

NHibernate 查询语法异常

c++ - 为什么 valgrind 将 64 位程序中的指针大小报告为 4 个字节

c++ - 模板/多态性

c++ - Syntastic 提示文件丢失

c - C 中的预处理器命令算作 token 吗?