#[cfg(test)]放在lib.rs的顶部会做什么?

问题描述 投票:3回答:1

我正在编写带有单元测试的Rust库(从货物生成)。

我想在单元测试中使用extern crate maplit,以便能够使用类似JavaScript的hashmap文字。我不想在我的图书馆代码中使用maplit。

maplit提供了一个显然必须使用#[macro_use]激活的宏。我能够完成所有工作的唯一方法是将其放置在lib.rs的顶部:

#[cfg(test)] #[macro_use] extern crate maplit;

// my crate-specific stuff

[这时我意识到我不完全知道#[cfg(test)]的作用。我在测试中使用它。按照惯例,这些都包含在库代码中,如下所示:

// some library code

#[cfg(test)]
mod test {
  use super::*;
  // tests here
}

我以为#[cfg(test)]行将直到文件(或块?)末尾的内容标记为仅适用于测试配置。

[如果是这样,那么将此指令放在lib.rs的顶部似乎是一个问题。编译发行版时,不会删除整个库吗?

我试图找到有关#[cfg(test)]的确切功能的文档,但无济于事。

rust
1个回答
3
投票
#[....]

上面是Rust Attribute,就像其他语言的注释一样。例如;在Java中,方法和类的名称为@Annotation(....)。与注解不同,rust属性可以是遵循属性语法的表达式。

#[cfg(....)]

以上为compiler configuration属性。 cfg()是许多built-in attributes之一。

#[cfg(test)]

以上内容告诉Rust编译器,仅当test配置为active时,才应编译以下代码。您可以具有其他配置属性,例如debugwindows或功能。

#[cfg(test)] #[macro_use] extern crate maplit;

与]相同>

#[cfg(test)]
#[macro_use]
extern crate maplit;

这告诉Rust编译器仅在test配置处于活动状态时才编译下一行,而下一行告诉Rust仅在以下板条箱中使用macros

如果是这样,那么将该指令放在lib.rs的顶部似乎是一个问题。编译发行版时,不会删除整个库吗?

#[cfg(...)]属性仅适用于附加的编译器条件在事物上

将属性放在文件顶部时,后跟一个空格。该属性附加到当前模块或板条箱。

如文档示例所示,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 = ();
}
© www.soinside.com 2019 - 2024. All rights reserved.