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。
使用 元名称值字符串 语法来指定子系统,值为 console
或 windows
。
在非 Windows 目标上,此属性将被忽略,对于非 bin
crate types 也是如此。
"console" 子系统是默认值。如果从现有控制台运行控制台进程,将附加到该控制台,否则将创建一个新的控制台窗口。
"windows" 子系统通常用于不希望在启动时显示控制台窗口的 GUI 应用程序。将在现有控制台之外运行。
#![allow(unused)] #![windows_subsystem = "windows"] fn main() { }