我在做一个铁 rust 项目.我正在使用Cargo功能标志来有条件地编译一些代码.在某些情况下,我必须在功能标志中包括entire文件,这样做,在每个函数&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

此外,在某些情况下,我还希望将整个目录包括在功能标志中.我该怎么做呢? for each 文件添加功能标志是一种方法.有没有更好的方式存在?

推荐答案

与在@MarcusDunn's answer中一样,正确的解决方案是将该属性应用于mod声明:

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

但是,为了完整起见,我想指出的是,属性可以应用于它们所在的项,而不是应用于下面的项.它们被称为"inner attributes",并通过在#后面添加!来指定:

#![cfg(feature="my-flag")] // Applies to the whole file

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() {}

Rust相关问答推荐

如何初始化match声明中的两个变量而不会激怒borrow 判断器?

使用Rust s serde_json对混合数据类型进行优化'

什么是Rust惯用的方式来使特征向量具有单个向量项的别名?

在Rust中显式装箱受生存期限制的转换闭包

是否可以使用Rust宏来构建元组的项?

Rust&;Tokio:如何处理更多的信号,而不仅仅是SIGINT,即SIGQUE?

借来的价值生命周期 不够长,不确定为什么它仍然是借来的

如何以与平台无关的方式将OsString转换为utf-8编码的字符串?

如何在 Rust 中打印 let-else 语句中的错误?

Rust 打包在 .deb 中

Rust typestate 模式:实现多个状态?

max(ctz(x), ctz(y)) 有更快的算法吗?

从光标位置旋转精灵

分配给下划线模式时会发生什么?

如何在 Emacs Elisp 中获得类似格式化的 LSP?

为什么 Rust 允许写入不可变的 RwLock?

如何创建递归borrow 其父/创建者的 struct ?

返回引用字符串的future

发生移动是因为 `data` 的类型为 `Vec`,它没有实现 `Copy` 特性

如何为枚举中的单个或多个值返回迭代器