Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

限制

以下属性影响编译时限制。

recursion_limit 属性

recursion_limit 属性可以应用于 crate 级别,以设置可能无限递归的编译时操作(如宏展开或自动解引用)的最大深度。

它使用 MetaNameValueStr 语法来指定递归深度。

Note

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 属性 设置在单态化期间构造具体类型时允许的最大类型替换次数。

Note

rustc 仅在 nightly 的 -Zenforce-type-length-limit 标志激活时强制执行该限制。

更多信息请参见 Rust PR #127670

Example

#![type_length_limit = "4"]

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

// 这无法编译,因为单态化为
// `f::<((((i32,), i32), i32), i32)>` 需要超过 4 个类型元素。
f(((((1,), 2), 3), 4));

Note

rustc 中的默认值是 1048576

type_length_limit 属性使用 MetaNameValueStr 语法。字符串中的值必须是非负数。

type_length_limit 属性只能应用于 crate 根。

Note

rustc 忽略其他位置的用法但会发出 lint 警告。这可能在将来成为错误。

只有第一次在项上使用 type_length_limit 才有效。

Note

rustc 会对第一次之后的使用发出 lint 警告。这可能在将来成为错误。