gpt4 book ai didi

rust - 是否有基于静态分析的 compile_error 的替代方案(例如通过优化器)

转载 作者:行者123 更新时间:2023-11-29 08:07:03 32 4
gpt4 key购买 nike

我有一个名为 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 中很少见)。

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

不过,您的目标有点复杂:如果编译器确定 panic 绝对会发生,您只需要一个错误。这更棘手,但您也可以使用此 hack 来解决它。

关于rust - 是否有基于静态分析的 compile_error 的替代方案(例如通过优化器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58124748/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com