【问题标题】:How many lines are covered by the Rust conditional compilation attribute?Rust 条件编译属性覆盖了多少行?
【发布时间】:2016-09-02 11:55:56
【问题描述】:

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

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

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

在这种情况下,条件编译属性实际上“覆盖”了多少行?它只是一个(我在这种情况下所期望的)吗?有没有办法确保整个代码块(包括变量、类型和两个函数)都被条件覆盖?

【问题讨论】:

    标签: rust conditional-compilation


    【解决方案1】:

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

    #[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) 值,因为 Playground 未定义 debug 功能,即使在调试模式下也是如此)。

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

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

    【讨论】:

    • 我确实考虑过用一个模块来包装我的声明,但最终决定不这样做。对我来说,模块是构建代码的一种方式,我不想通过使用条件编译来预设结构。不过我不得不承认,如果必须做大量的声明,我会解决(目前我只需要做 4 个)
    • 只有 4 个声明,目前可能是可以管理的,尽管使用模块并没有真正的开销并且可能会节省几行代码,特别是如果您将来需要扩展它。您是否有任何特别的原因反对使用模块,或者它对于您的需求来说太庞大了?
    【解决方案2】:

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

    编辑:我认为目前不可能将属性分散到任意数量的声明中。

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

    【讨论】:

    • 谢谢!我搜索了 Rust 书,但只查看了条件编译的解释。感谢您为我指出正确的地方!
    • 我的问题的第二部分仍然存在:有没有办法告诉编译器这样的属性应该涵盖多个声明?
    • @DerNils 关于 StackOverflow 的快速提示:每个问题帖子只问一个问题。在这种情况下,这还不错,因为这些问题是紧密相连的。所以只是为了你的未来:一定要问一个问题;否则你可能会被否决。从这个意义上说:欢迎来到 SO :)
    • @LukasKalbertodt 感谢您的提示和热烈欢迎!我希望我的第一个问题不会直接导致投反对票:-)
    • @ljedrz 感谢您对第二方面的回答!
    猜你喜欢
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 2019-08-09
    • 2017-10-14
    相关资源
    最近更新 更多