Rust 运行时

本节所记录的特性,定义了 Rust 运行时的某些方面。

panic_handler 属性

panic_handler 属性 只能应用于具有签名 fn(&PanicInfo) -> ! 的函数。 使用此 属性 标记的函数定义了 panic 的行为。 PanicInfo 结构包含有关 panic 位置的信息。 在二进制、 dylib 或 cdylib crate 的依赖图中,必须有一个单独的 panic_handler 函数。

下面是一个 panic_handler 函数,它记录 panic 消息,然后停止线程。

#![no_std]

use core::fmt::{self, Write};
use core::panic::PanicInfo;

struct Sink {
    // ..
   _0: (),
}

impl Sink {
    fn new() -> Sink { Sink { _0: () }}
}

impl fmt::Write for Sink {
    fn write_str(&mut self, _: &str) -> fmt::Result { Ok(()) }
}

#[panic_handler]
fn panic(info: &PanicInfo) -> ! {
    let mut sink = Sink::new();

    // logs "panicked at '$reason', src/main.rs:27:4" to some `sink`
    let _ = writeln!(sink, "{}", info);

    loop {}
}

标准行为

标准库提供了一个默认情况下会展开堆栈的 panic_handler 实现,但可以 更改为终止进程。 可以使用 set_hook 函数在运行时修改标准库的 panic 行为。

global_allocator 属性

global_allocator 属性 用于设置实现 GlobalAlloc trait 的 静态条目 的全局分配器。

windows_subsystem 属性

windows_subsystem 属性 可以在 Windows 目标上的链接时应用于 crate 级别,以设置 subsystem。 使用 元名称值字符串 语法来指定子系统,值为 consolewindows。 在非 Windows 目标上,此属性将被忽略,对于非 bin crate types 也是如此。

"console" 子系统是默认值。如果从现有控制台运行控制台进程,将附加到该控制台,否则将创建一个新的控制台窗口。

"windows" 子系统通常用于不希望在启动时显示控制台窗口的 GUI 应用程序。将在现有控制台之外运行。

#![allow(unused)]
#![windows_subsystem = "windows"]
fn main() {
}