问题

我有一个名为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
 

我想要的是停止编译,如果编译器确定,将使用true值调用函数foo.我想尽快获悉(所以编译时间比运行时更好).所以我想要像compile_error!这样的东西,但基于静态分析.如果编译器不确定是否调用true分支,则编译它绝对可以 – 程序将在运行时惊慌.

compile_error!可悲地对我无法使用,因为我不希望以下代码在编译时失败

 if false {
   compile_error!("Some error");
}
 

  最佳答案

这不可能使用compile_error!.在发生代码优化之前,对宏进行了评估.基本上只有两个上下文compile_error!现在有用:

  • 使用#[cfg(...)]进行条件编译
  • 宏生成可能包含compile_error!的代码

这两个都是在发出compile_error!错误之前进行评估的。

没有很好的功能让你做你想要实现的东西.但是,存在一种黑客.它被 no-panic crate 使用,并在链接时导致错误(通常在Rust中很少看到的东西).

这个技巧可以通过在每个恐慌位置插入对未知符号的引用来工作.如果优化器(在编译管道中运行很晚但仍然主要在链接之前)可以删除导致panic的分支,它也会删除对未知符号的引用.如果优化器无法删除分支,则最终代码包含对该未知符号的引用,链接器将产生“未定义的引用....”错误.这不是一个很好的错误,但它会停止编译程序.

但是,您的目标有点复杂:如果编译器确信绝对会发生恐慌,您只想要一个错误.这更棘手,但您也可以使用这个黑客来解决它.

  相同标签的其他问题

rust