是否可以有条件地启用类似“派生”的属性?

我已经增加了一个功能,在我的板条箱,增加了 serde的支持。然而,我不太明白如何正确使用它:

// #[derive(Debug, Serialize, Deserialize, Clone)] // goes to:


#[derive(Debug, Clone)]
#[cfg(feature = "serde_support")]
#[derive(Serialize, Deserialize)]
pub struct MyStruct;

这段代码将 cfg(feature)以下的所有内容都视为有条件编译的,因此如果没有我的 serde_support特性,我的板条箱也就没有 MyStruct

我曾试图用大括号包装它,但它出现了另一个错误:

密码:

#[derive(Debug, Clone)]
#[cfg(feature = "serde_support")] {
#[derive(Serialize, Deserialize)]
}
pub struct MyStruct;

错误:

error: expected item after attributes
--> mycrate/src/lib.rs:65:33
|
65 | #[cfg(feature = "serde_support")] {
|                                 ^

那么该怎么做呢?

11091 次浏览

您可以使用 cfg_attr(a, b)属性:

#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde_support", derive(Serialize, Deserialize))]
pub struct MyStruct;

关于“条件编译”的锈参考中有这样的描述:

#[cfg_attr(a, b)]
item

如果 acfg设置,则与 #[b] item相同,否则与 item相同。