Rust条件编译属性覆盖了多少行?

时间:2016-09-02 11:55:57

标签: rust conditional-compilation

我试图使用条件编译语句。除了定义应该只存在于调试版本中的函数之外,我还想定义一组仅存在于调试版本中的变量/常量/类型。

#[cfg(debug)]
pub type A = B;
pub type B = W;

#[cfg(other_option)]
pub type A = Z;
pub type B = I;
let test = 23i32;

实际上有多少行"涵盖"在这种情况下由条件编译属性?它只是一个(在这种情况下我会期待什么)?有没有办法确保条件涵盖整个代码块(包括变量,类型和两个函数)?

2 个答案:

答案 0 :(得分:4)

#[attribute]仅适用于下一个item。请参阅Rust book

编辑:我认为目前无法在任意数量的声明中传播属性。

有关属性及其应用的更多深入信息,请访问Rust reference

答案 1 :(得分:4)

您可以使用模块将调试/发布应存在的所有内容组合在一起,如下所示:

#[cfg(debug)]
mod example {
    pub type A = i32;
    pub type B = i64;
}

#[cfg(not(debug))]
mod example {
    pub type A = u32;
    pub type B = u64;
}

fn main() {
    let x: example::A = example::A::max_value();
    println!("{}", x);
}

Playground link(请注意,这将始终打印not(debug)值,因为即使在调试模式下,操场也无法定义debug功能。

如果定义了debug,则会打印2147483647i32的最大值),否则会打印4294967295u32的最大值1}})。请记住,两个模块必须具有每个项目的定义,否则您将遇到编译时错误。

如果您还没有阅读Attributes,那么这样做可能是个好主意;确保你知道内部属性(#![attribute])和外部属性(#[attribute])之间的区别。