rust 货物:如何包括整个目录或文件的功能标志?

tvmytwxo  于 2023-01-26  发布在  其他
关注(0)|答案(4)|浏览(98)

我正在做一个Rust项目。我正在使用Cargo特性标志对一些代码进行条件编译。有些情况下,我必须在特性标志中包含整个文件,因此在每个函数和use语句上添加#[cfg(feature="my-flag")]没有多大意义。
因此,为了将整个文件包含在特性标志中,我考虑将文件中的所有内容包围在一个块中,并为该块添加特性标志。

#[cfg(feature="my-flag")]
{
  use crate::access_control::{func1, func2};
  use crate::models;
  ...

  #[derive(Debug)]
  pub enum MyEnum{..}
  
  #[derive(Clone)]
  pub Struct MyStruct{..}

  pub fn my_func() {...}
  fn my_func_internal() {...}
  ...
}

但是我得到了错误Syntax Error: expected an item after attributes
另外,也有一些情况下,我想把整个目录都包含在特性标志中。我应该怎么做呢?为每个文件添加特性标志是一种方法。有更好的方法吗?

h43kikqp

h43kikqp1#

https://doc.rust-lang.org/cargo/reference/features.html开始

// This conditionally includes a module which implements WEBP support.
#[cfg(feature = "webp")]
pub mod webp;

这可以是整个目录,也可以是单个文件,这取决于模块的结构。

vm0i2vca

vm0i2vca2#

正如@MarcusDunn的回答一样,正确的解决方案是将该属性应用于mod声明:

// This conditionally includes a module which implements WEBP support.
#[cfg(feature = "webp")]
pub mod webp;

然而,为了完整起见,我想指出的是,属性可以应用于它们所在的项,而不是应用于后面的项,这些项称为"inner attributes",通过在#之后添加一个!来指定:

#![cfg(feature="my-flag")]

use crate::access_control::{func1, func2};
use crate::models;

#[derive(Debug)]
pub enum MyEnum {}
  
#[derive(Clone)]
pub struct MyStruct {}

pub fn my_func() {}
fn my_func_internal() {}
fnvucqvd

fnvucqvd3#

你可以在模块上使用条件编译。也许类似下面这样的东西会适合你的用例:

#[cfg(feature = "feat")]
use feat::S;
#[cfg(not(feature = "feat"))]
use no_feat::S;

mod feat {
    pub const S: &str = "feat";
}

mod no_feat {
    pub const S: &str = "no_feat";
}

fn main() {
    println!("{}", S);
}

使用cargo run运行:

no_feat

使用cargo run --features feat运行:

feat
efzxgjgh

efzxgjgh4#

您可以使用cfg-if板条箱:

cfg_if::cfg_if! {
    if #[cfg(feature = "my-flag")] {
        // ...
    }
}

相关问题