20个版本 (12个破坏性更新)
| 0.13.0 | 2024年2月17日 |
|---|---|
| 0.11.0 | 2023年11月23日 |
| 0.8.0 | 2023年7月20日 |
| 0.5.0 | 2023年3月16日 |
| 0.3.3 | 2022年11月27日 |
#97 in 无标准库
每月下载量126
570KB
7.5K SLoC
NSTD
一个跨平台、快速、安全的通用C库,用Rust编写。
该库组织为一组模块。顶级模块 nstd 包含整个包。每个模块可以有它们自己的子模块(例如 nstd.io.stdout 或 nstd::io::stdout,使用Rust语法)。
使用C的示例
// Build nstd with features set to "capi core io".
#include <assert.h>
#include <nstd.h>
/// Main entry point of the program.
int main(void) {
const NSTDOptionalStr output_opt = nstd_core_str_from_raw_cstr("Hello, 🌎!");
assert(output_opt.status);
const NSTDStr output = output_opt.value.some;
const NSTDIOError err = nstd_io_print_line(&output);
assert(err == NSTD_IO_ERROR_NONE);
return 0;
}
库模块
nstd- 一个用Rust编写的跨平台、快速、安全的通用C库。alloc- 低级内存分配。core- 为nstd提供核心功能。alloc- 提供用于内存分配支持的有用类型。cstr- 不拥有的C字符串切片。raw- 原始C字符串处理。
cty- 提供用于检查和操作字符类型的功能。def- 包含在nstd中使用的一些常见类型。fty- 提供用于检查和操作浮点类型的功能。ity- 提供用于检查和操作整型类型的功能。math- 低级数学运算。mem- 包含与原始内存交互的大多数不安全函数。ops- 为可能引起溢出的类型和运算符提供重载。optional- 表示一个可选(可能未初始化)的值。ptr- 指向任意类型的带大小指针。range- 数值范围。result- 定义一个具有成功和错误变体的 "结果" 类型。slice- 对内存中一系列值的视图。str- 对UTF-8编码的字节字符串的未拥有视图。time- 低级时间实用程序。unichar- Unicode标量值。
cstring- 动态大小的、以null结尾的C字符串。env- 进程环境管理。fs- 提供对文件系统的访问。file- 打开文件的句柄。
heap_ptr- 单值堆分配的指针类型。io- 提供与标准I/O流交互的功能。stderr- 标准错误流的句柄。stdin- 标准输入流的句柄。stdout- 标准输出流的句柄。
math- 高级数学运算。mutex- 一个用于保护共享数据的互斥原语。os- 操作系统特定功能。unix- 低级类Unix操作系统支持。alloc- 类Unix系统的内存分配。io- 提供在Unix平台上处理输入和输出的功能。mutex- 一个用于保护共享数据的互斥原语。shared_lib- 为类Unix系统提供共享库访问。time- Unix时间工具。
windows- Windows操作系统支持。alloc- Windows的低级内存分配。heap- Windows进程堆管理。
shared_lib- Windows的共享库/模块访问。str- Windows的字符串切片扩展。
proc- 调用/子进程管理。shared_lib- 访问已加载的共享库中的符号。shared_ptr- 一个引用计数智能指针。string- 动态大小的UTF-8编码的字节字符串。thread- 线程创建、连接和分离。time- 时间工具。timed_mutex- 带定时锁定机制的互斥原语。vec- 动态大小的值连续序列。
平台支持
nstd.core 应该支持Rust编译器支持的所有功能。此模块对裸机环境有第一类支持。
nstd.os 的子模块只能在它们针对的操作系统上工作。例如,nstd.os.windows 只能在Windows上工作,而 nstd.os.unix 只能在类Unix系统上工作。
其他模块将在大多数平台上工作,主要针对Windows、macOS、Linux、Android和iOS。
语言支持
此库可以从支持调用C代码的任何语言访问。目前,这需要手动完成,因为没有官方的包装器,但是当API变得更加稳定时,计划开始添加官方包装器,以便其他语言的开发者可以轻松使用API。
安全性
请注意,这些安全说明(以及整个框架)都是工作在进度中。
用户安全说明
-
原始指针访问是不安全的。
-
假设引用是有效的(对齐的、非空的和非悬挂的),并且是安全的访问。用户可以参考文档以查看哪些API期望或返回有效的引用。
-
假设C函数指针非空,除非它们被包装在
Option中。 -
私有(非
pub)结构体成员不允许用户直接访问。 -
在访问之前必须检查标记枚举变体(例如
NSTDOptional或NSTDResult类型)。 -
当使用未实现
Copy的类型时的值拷贝语义时,数据会被移动。 -
当数据被另一个对象引用时,数据不允许被移动或修改。
-
未实现
Send特征的类型不允许在线程之间发送。 -
未实现
Sync特征的类型不允许在线程之间共享。
贡献者安全注意事项
-
任何可能导致未定义行为的操作必须标记为不安全。
-
API接受的全部C函数指针都必须标记为不安全。
-
默认情况下,panic行为设置为终止,因为从Rust代码反解构到外部代码是未定义行为(尽管这可能会改变)。
如何构建
将nstd构建为C库需要您手动指定"crate-type"。为此,您必须将--crate-type传递给rustc,可以是cdylib或staticlib。如果需要两者,Rust允许您多次使用此标志。
nstd让您选择想要使用哪些功能。
顶层模块下的任何模块都有一个专用的功能标志,例如nstd.core有功能标志core,而nstd.alloc有功能标志alloc。
每个模块可能有额外的功能,例如nstd.os有用于Windows内存分配的附加os_windows_alloc功能,这允许其他模块使用Windows的低级内存分配API,而不必为其他操作系统启用内存分配。
std功能标志将Rust标准库链接到二进制文件中。
capi功能标志用于将nstd构建为C库。
link功能标志将链接到系统上现有的nstd库。此功能被鼓励,但不是必需的,对于使用nstd的capi功能的Rust包。
std和core默认启用。
示例
cargo rustc --release --crate-type cdylib --crate-type staticlib --features "capi alloc string"
构建时启用所有模块
cargo rustc --release --crate-type cdylib --crate-type staticlib --features "nstd"
使用cargo-c安装
nstd还允许您使用cargo-c构建或安装库。
安装cargo-c
cargo install cargo-c
以下是一个示例,说明如何构建启用所有功能的Unix机器上的库
cargo cinstall --release --all-features --destdir=./install --prefix=/usr --libdir=/usr/lib
这将创建一个新目录install,其中包含安装内容。
现在您可以使用cp将内容复制到根目录
sudo cp -a ./install/* /
更多信息可以在cargo-c仓库以及Luca Barbato的这篇博客文章中找到。
发布
nstd版本遵循语义版本规则。每个版本都有一个主版本号、次版本号和补丁号,这些构成了库的版本(major.minor.patch)。
框架尚未稳定,因此尚未有任何重大版本发布。
每6周发布一个新的小版本,正好在新的小版本Rust发布后一周。
修补版本会不定期发布,包含一些小修复和新增功能。
有关语义版本化的更多信息,请参阅semver.org。
依赖项
~0–8.5MB
~66K SLoC