4、Rust参考手册——Crate和源文件

目录

  • [1. main函数](#1. main函数)

    • [1.1 未捕获的外部展开(这部分内容主要在std::panic模块展开)](#1.1 未捕获的外部展开(这部分内容主要在std::panic模块展开))
    • [1.2 no_main属性](#1.2 no_main属性)
  • [2. crate_name属性(cargo管理时不用)](#2. crate_name属性(cargo管理时不用))

  • 参考

    Syntax
    Crate ->
    InnerAttribute*
    Item*

  Crate(匿名的顶层模块)以零个或多个InnerAttribute开头,以零个或多个Item结尾。

  Rust的语义遵循编译时与运行时的阶段区分。具有静态解释的语义规则决定编译的成功,具有动态解释的语义规则决定程序运行时的行为。

  编译模型以称为crate的产物为中心。每次编译处理单个源码形式的crate,若成功,则产出单个二进制i形式的crate:可执行文件或库。

  crate是编译与链接的单元,同时也是版本管理、分发和运行时加载的单元。crate包含一棵由嵌套的模块作用域构成的树。这棵树的顶层是一个(从模块内路径的角度来看)匿名的模块。crate内部的任何项都有一个规范的模块路径,指明它在crate模块树中的位置。

  Rust编译器被调用时总是以单个源文件作为输入,并且总是产出单个输出crate。对该源文件的处理可能导致其他源文件作为模块被加载。源文件的扩展名为.rs。

  一个Rust源文件描述一个模块,而该模块在当前crate模块树中的名称与位置是在源文件之外定义的:要么由引用它的源文件中的显式Module项定义,要么由crate本身的名称定义。

  每个源文件都是一个模块,但并非每个模块都需要自己的源文件:模块定义可以嵌套在同一个文件中。

  每个源文件包含零个或多个项定义的序列,并可选地以任意数量的、作用于所属模块的属性开头,这些属性大多会影响编译器的行为。

  匿名的crate模块可以拥有作用于整个crate的额外属性。

  使用了Cargo之后不建议这么做。

rust 复制代码
// src/lib.rs
// 指定crate名称
#![crate_name = "projx"]
// 指定输出产物的类型
#![crate_type = "lib"]

// 打开一条警告
// 这可以在任何模块中完成,而不仅限于匿名的crate模块
#![warn(non_camel_case_types)]

1. main函数

  包含main函数的crate可以被编译为可执行文件。

  若存在main函数,它必须:不接受任何参数,不得声明任何trait或生命周期约束、不得带有任何where子句,且其返回类型必须实现Termination trait。

rust 复制代码
fn main() {}
rust 复制代码
fn main() -> ! {
	std::process::exit(0);
}
rust 复制代码
fn main() -> impl std::process::Termination {
	std::process::ExitCode::SUCCESS
}

  main函数也可以是一个导入,例如来自外部crate或当前crate。

rust 复制代码
mod foo {
	pub fn bar() {
		println!("Hello, world!");
	}
}

use foo::bar as main;

  标准库中实现了Termination trait的类型:

  ()

  !

  Infallible

  ExitCode

  Result<T, E> where T: Termination, E: Debug

1.1 未捕获的外部展开(这部分内容主要在std::panic模块展开)

  当外来的unwind(例如从C++代码抛出的异常,或使用不同panic处理器的Rust代码中的panic!)传播越过main函数时,进程将被安全地终止。这可能以中止的形式进行,此时不保证会执行任何Drop调用,且错误输出所含信息可能不如运行时被原生Rust panic终止时丰富。

1.2 no_main属性

  no_main属性可以在crate级别应用,用于禁止为可执行二进制文件发出main符号。当被链接的其他目标文件定义了main时,这一属性很有用。

2. crate_name属性(cargo管理时不用)

  crate_name属性可以在crate级别应用,使用MetaNameValueStr(属性那一章会将)语法指定crate名称。

rust 复制代码
#![crate_name = "mycrate"]

  crate名称不得为空,且只能包含Unicode字母数字字符或_字符。

参考

1、Crate和源文件

相关推荐
gopher951116 小时前
RUST:序列化与反序列化 serde + derive 详解
开发语言·后端·rust
遇码1 天前
流式调用中途断连别直接报错:瞬态故障识别、退避重试与中文根因诊断的搭建方法
大数据·人工智能·ai·rust·数据分析·大模型·agent
DongQiShanRen1 天前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
alwaysrun1 天前
Web之wasm-pack详解
前端·rust·web·wasm
DongQiShanRen2 天前
六根硬件映射(下):物理闭环五步法,抽一条已实装的看
大数据·jvm·人工智能·算法·rust·哈希算法·集成学习
Zenova EdgeOS2 天前
Rust TUI 实战:用 ratatui 构建工业边缘终端界面
开发语言·后端·rust·工业网关
遇码2 天前
不用转场引擎做幻灯片转场:相机滑动、黑场淡入与真全屏的完整做法
人工智能·数码相机·ai·rust·大模型·agent
lpfasd1232 天前
node-sass 停止维护!老项目迁移 Dart Sass 完整教程
前端·rust·sass
Flynt2 天前
我把真实的 ES 查询怼到 7059 星的 Rust 搜索引擎上:1366/1369 的兼容承诺,裂了 3 个缝
elasticsearch·搜索引擎·rust
小杍随笔2 天前
egui 0.37 升级实录:卡顿修复与5倍性能回退
windows·rust·egui