unreachable!
宏的存在纯粹是为了在阅读代码时清晰起见,还是它提供了任何功能上的优势?
答案 0 :(得分:14)
是的,unreachable!
macro(以及unimplemented!
)纯粹是为了清晰起见。他们implemented直接转发到panic!
。
#[macro_export]
#[stable(feature = "rust1", since = "1.0.0")]
macro_rules! unreachable {
() => ({
panic!("internal error: entered unreachable code")
});
($msg:expr) => ({
unreachable!("{}", $msg)
});
($fmt:expr, $($arg:tt)*) => ({
panic!(concat!("internal error: entered unreachable code: ", $fmt), $($arg)*)
});
}
#[macro_export]
#[stable(feature = "rust1", since = "1.0.0")]
macro_rules! unimplemented {
() => (panic!("not yet implemented"))
}
不要与unreachable
intrinsic混淆(通过unreachable
或debug_unreachable
crates可以在稳定的Rust中访问),不安全断言分支是完全无法访问的。这允许在优化时完全移除分支。如果断言证明是错误的,那么它可能导致未定义的行为,而unreachable!()
只会引起恐慌。