#编译时 #常量 #拷贝 #常量 #特质 #评估 #构建

const

创建实现 Copy 特质的类型的编译时评估常量

3 个版本

使用旧的 Rust 2015

0.2.2 2017年6月24日
0.2.1 2017年6月24日
0.2.0 2017年6月24日

#6 in #评估

MIT 许可证

6KB
59

const

构建时拷贝常量。

请参阅文档以获取详细信息。请注意文档中的警告。


lib.rs:

构建时评估表达式

const 允许在构建任何实现 Copy 特质的类型的构建时定义常量。值通过 build.rs 生成

// build.rs
#[macro_use]
extern crate cconst;

use std::net::Ipv4Addr;

let mut cs = CopyConsts::new();
cs.add_const("default_ns", "::std::net::Ipv4Addr", {
    Ipv4Addr::new(8, 8, 8, 8)
});
cs.write_code().unwrap();

设置完成后,可以使用 cconst! 宏包含它们

// main.rs
#[macro_use]
extern crate cconst;

include!(cconst!(default_ns));

fn main() {
    println!("default_ns: {:?}", default_ns());
}

内部机制

const 通过将 build.rs 中定义的值序列化为字节切片字面量,并在适用处包含它们来工作。上面的示例将生成以下大致代码

#[inline]
fn default_ns() -> &'static ::std::net::Ipv4Addr {
    const BUF: &[u8] = &[0x08, 0x08, 0x08, 0x08, ];
    unsafe { &*(BUF.as_ptr() as *const ::std::net::Ipv4Addr) }
}

调用 default_ns() 应该导致内联指针转换和极小的开销。

注意事项

由于代码生成的方式,提供给 add_const! 宏的类型应该是完全限定的,即以 :: 开始。如果不是,则必须在 include! 调用点可见。

尽管 Copy 表示类型可以自由复制,但如果类型持有编译器所不知道的外部资源,则类型不能被编译生成。

具有相同名称但不同的类型会导致未定义行为,并可能产生灾难性的后果。这最有可能发生在所需的 crate 的 build_dependenciesdependencies 版本不同时。

待办事项

  • #[no_std] 支持

无运行时依赖