#[....]
上面是一个生锈属性 https://doc.rust-lang.org/reference/attributes.html这就像其他语言中的注释。例如;在Java中我们有@Annotation(....)
对于方法和类。与注释不同,rust 属性可以是遵循属性语法的表达式。
#[cfg(....)]
上面是一个编译器配置 https://doc.rust-lang.org/reference/conditional-compilation.html#the-cfg-attribute属性。这cfg()
是众多之一内置属性 https://doc.rust-lang.org/reference/attributes.html#built-in-attributes-index.
#[cfg(test)]
上面的代码告诉 Rust 编译器,只有在以下情况下才应该编译以下代码:test
配置是active。您可以拥有其他配置属性,例如debug
, windows
或特征。
#[cfg(test)] #[macro_use] extern crate maplit;
是相同的
#[cfg(test)]
#[macro_use]
extern crate maplit;
这告诉 Rust 编译器仅编译下一行,如果test
配置处于活动状态,下一行告诉 Rust 仅使用macros从下面的箱子里。
如果是这样,那么将此指令放在 lib.rs 的顶部似乎是一个问题。当我编译发行版时,我的整个库不会被删除吗?
The #[cfg(...)]
属性仅适用于编译器条件在事物上它被附加到。
当您将属性放在文件顶部时,后跟一个空格。该属性附加到当前模块或 crate。
如文档示例所示,crate_type
应用于整个文件:
// General metadata applied to the enclosing module or crate.
#![crate_type = "lib"]
// A function marked as a unit test
#[test]
fn test_foo() {
/* ... */
}
// A conditionally-compiled module
#[cfg(target_os = "linux")]
mod bar {
/* ... */
}
// A lint attribute used to suppress a warning/error
#[allow(non_camel_case_types)]
type int8_t = i8;
// Inner attribute applies to the entire function.
fn some_unused_variables() {
#![allow(unused_variables)]
let x = ();
let y = ();
let z = ();
}