我有一个称为foo
的函数。
fn foo(val: bool) {
if val {
panic!("This should not ever happened");
} else {
// do something useful
}
}
// somewhere else
foo(true); // this should cause compile error
我想要的是停止编译,如果编译器确定的话,将使用foo
值调用函数true
。我想尽快得到通知(因此编译时间比运行时要好)。所以我想要类似compile_error!
但基于静态分析的东西。如果编译器不确定是否调用true
分支,则绝对可以进行编译-程序在运行时会出现紧急情况。
compile_error!
对我来说可悲的是无法使用,因为我不希望以下代码在编译时失败
if false {
compile_error!("Some error");
}
compile_error!
无法做到这一点。在代码优化之类的事情发生之前,对宏进行了评估。目前只有compile_error!
在两种情况下有用:
#[cfg(...)]
进行有条件编译compile_error!
的宏生成代码这两者均在发出compile_error!
错误之前进行评估。
没有很好的功能可以让您做自己想做的事情。但是,存在一种hack。它由the no-panic
crate使用,并在链接时导致错误(在Rust中通常很少见)。
该技巧通过在每个紧急位置插入对未知符号的引用来起作用。如果优化器(在编译管道中运行得很晚,但仍主要在链接之前运行)可以删除通往no-panic
的分支,则它也会删除对未知符号的引用。如果优化器无法删除该分支,则最终代码将包含对该未知符号的引用,链接器将生成“对...的未定义引用”错误。这不是一个很好的错误,但会阻止程序编译。
不过,您的目标还有些复杂:如果编译器确定绝对会发生恐慌,则只希望出错。这比较棘手,但是您也可以使用此技巧来解决它。