Rust 运行时

本节介绍定义 Rust 运行时某些方面的功能。

panic_handler 属性

panic_handler 属性 只能应用于签名为 fn(&PanicInfo) -> ! 的函数。标记为此 属性 的函数定义了 panic 的行为。PanicInfo 结构体包含有关 panic 位置的信息。在二进制文件、动态链接库或 cdylib 包的依赖图中必须有一个 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 特征的 静态项,以设置全局分配器。

windows_subsystem 属性

windows_subsystem 属性 可以在包级别应用,以便在 Windows 目标上链接时设置 子系统。它使用 MetaNameValueStr 语法来指定子系统,其值为 consolewindows。在非 Windows 目标上以及非 bin 包类型 时,将忽略此属性。

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

“windows”子系统通常由 GUI 应用程序使用,这些应用程序不希望在启动时显示控制台窗口。它将与任何现有控制台分离运行。

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