限制

下面的 属性 影响编译时的限制。

recursion_limit 属性

recursion_limit 属性 可以在 crate 级别上应用,以设置潜在的无限递归编译时操作 (如宏展开或自动解引用) 的最大深度。它使用 元名称值字符串 语法来指定递归深度。

注意:rustc 中的默认值是 128。

#![allow(unused)]
#![recursion_limit = "4"]

fn main() {
macro_rules! a {
    () => { a!(1); };
    (1) => { a!(2); };
    (2) => { a!(3); };
    (3) => { a!(4); };
    (4) => { };
}

// 这段代码无法扩展,因为它需要超过 4 的递归深度。
a!{}
}
#![allow(unused)]
#![recursion_limit = "1"]

fn main() {
// 这个失败是因为它需要进行两个递归步骤来自动解引用。
(|_: &u8| {})(&&&1);
}

type_length_limit 属性

type_length_limit 属性限制了当进行单态化时,构建具体类型所做的最大类型替换数量。 它应用于 crate 级别,使用 元名称值字符串 语法设置限制,以基于类型替换数量设置限制。

注意:rustc 中的默认值为 1048576。

#![allow(unused)]
#![type_length_limit = "4"]

fn main() {
fn f<T>(x: T) {}

// 编译失败,因为将 f::<((((i32,), i32), i32), i32)> 进行单态化需要超过 4 个类型元素。
f(((((1,), 2), 3), 4));
}