3 个版本
使用旧的 Rust 2015
0.2.2 | 2017年6月24日 |
---|---|
0.2.1 | 2017年6月24日 |
0.2.0 | 2017年6月24日 |
#6 in #评估
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_dependencies
和 dependencies
版本不同时。
待办事项
-
#[no_std]
支持