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
的实现,默认行为是展开堆栈,但可以 更改为中止进程。标准库的 panic 行为可以在运行时使用 set_hook 函数进行修改。
global_allocator
属性
global_allocator
属性 用于实现 GlobalAlloc
trait 的 静态项,以设置全局分配器。
windows_subsystem
属性
windows_subsystem
属性 可以应用于 crate 级别,以在 Windows 目标上链接时设置 子系统。它使用 MetaNameValueStr 语法来指定子系统,值为 console
或 windows
。此属性在非 Windows 目标上以及非 bin
crate 类型 上被忽略。
“console” 子系统是默认设置。如果控制台进程从现有控制台运行,则它将附加到该控制台;否则,将创建一个新的控制台窗口。
“windows” 子系统通常由不希望在启动时显示控制台窗口的 GUI 应用程序使用。它将与任何现有控制台分离运行。
#![allow(unused)] #![windows_subsystem = "windows"] fn main() { }