xref: /DragonOS/docs/kernel/libs/unified-init.md (revision 91e9d4ab55ef960f57a1b6287bc523ca4341f67a)
1*91e9d4abSLoGin# unified-init 统一初始化库
2*91e9d4abSLoGin
3*91e9d4abSLoGin:::{note}
4*91e9d4abSLoGin本文作者:龙进 <longjin@DragonOS.org>
5*91e9d4abSLoGin
6*91e9d4abSLoGin2023年12月25日
7*91e9d4abSLoGin:::
8*91e9d4abSLoGin
9*91e9d4abSLoGin## 1. 简介
10*91e9d4abSLoGin
11*91e9d4abSLoGin该库位于`kernel/crates/unified-init`中.
12*91e9d4abSLoGin提供统一初始化宏,用于将函数注册到统一初始化列表中. 便于统一进行初始化.
13*91e9d4abSLoGin
14*91e9d4abSLoGin需要注意的是,初始化器的数组是no_mangle的,因此其命名应当遵守`模块_初始化器`的规则,防止重名导致意想不到的错误.
15*91e9d4abSLoGin
16*91e9d4abSLoGin
17*91e9d4abSLoGin## 2. 用法
18*91e9d4abSLoGin
19*91e9d4abSLoGin
20*91e9d4abSLoGin```rust
21*91e9d4abSLoGinuse system_error::SystemError;
22*91e9d4abSLoGinuse unified_init::define_unified_initializer_slice;
23*91e9d4abSLoGinuse unified_init_macros::unified_init;
24*91e9d4abSLoGin
25*91e9d4abSLoGin/// 初始化函数都将会被放到这个列表中
26*91e9d4abSLoGindefine_unified_initializer_slice!(INITIALIZER_LIST);
27*91e9d4abSLoGin
28*91e9d4abSLoGin#[unified_init(INITIALIZER_LIST)]
29*91e9d4abSLoGinfn init1() -> Result<(), SystemError> {
30*91e9d4abSLoGin   Ok(())
31*91e9d4abSLoGin}
32*91e9d4abSLoGin
33*91e9d4abSLoGin#[unified_init(INITIALIZER_LIST)]
34*91e9d4abSLoGinfn init2() -> Result<(), SystemError> {
35*91e9d4abSLoGin   Ok(())
36*91e9d4abSLoGin}
37*91e9d4abSLoGin
38*91e9d4abSLoGinfn main() {
39*91e9d4abSLoGin    assert_eq!(INITIALIZER_LIST.len(), 2);
40*91e9d4abSLoGin}
41*91e9d4abSLoGin
42*91e9d4abSLoGin```
43*91e9d4abSLoGin
44*91e9d4abSLoGin## 3.开发
45*91e9d4abSLoGin
46*91e9d4abSLoGin需要测试的时候可以在`main.rs`写测试代码,
47*91e9d4abSLoGin然后在当前目录执行 `cargo expand --bin unified-init-expand`
48*91e9d4abSLoGin就可以看到把proc macro展开后的代码了.
49*91e9d4abSLoGin
50*91e9d4abSLoGin## 4. Maintainer
51*91e9d4abSLoGin
52*91e9d4abSLoGin龙进 <longjin@DragonOS.org>
53*91e9d4abSLoGin
54*91e9d4abSLoGin
55