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 может применяться на уровне крейта для установки максимальной глубины для потенциально бесконечно рекурсивных операций времени компиляции, таких как раскрытие макросов или авто-разыменование.

Он использует синтаксис 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 применяет это ограничение только тогда, когда активен ночной флаг -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 может применяться только к корню крейта.

Note

rustc игнорирует использование в других позициях, но выдает предупреждение. В будущем это может стать ошибкой.

Только первое использование type_length_limit на элементе имеет эффект.

Note

rustc выдает предупреждение на любое использование после первого. В будущем это может стать ошибкой.