What is the proper way to use the `cfg!` macro to choose between multiple implementations?

后端 未结 1 586
离开以前
离开以前 2020-12-22 09:49

I have specified a few features inside Cargo.toml:

[features]
complex = []
simple = []

When I build my project I use car

1条回答
  •  执念已碎
    2020-12-22 10:10

    The documentation for cfg! states:

    Boolean evaluation of configuration flags.

    That means that cfg!(...) is replaced with a Boolean (true / false). Your code would look something like this, after it's expanded:

    fn test() -> u32 {
        let x = 3;
        if true {
            let y = 2;
            x + y
        }
        if true {
            let y = 1;
            x + y
        }
    }
    

    The easiest solution is to add an else:

    fn test() -> u32 {
        let x = 3;
        if cfg!(feature = "complex") {
            let y = 2;
            x + y
        } else {
            let y = 1;
            x + y
        }
    }
    

    You can also use the attribute form of cfg. In this case, the attribute can prevent the entire next expression from being compiled:

    fn test() -> u32 {
        let x: u32 = 3;
    
        #[cfg(feature = "complex")]
        {
            let y: u32 = 2;
            x + y
        }
    
        #[cfg(feature = "simple")]
        {
            let y: u32 = 1;
            x + y
        }
    }
    

    as it tries to evaluate both expressions.

    No, it doesn't. Evaluation occurs at run-time, and this code cannot even be compiled.

    See also:

    • Is it possible to conditionally compile a code block inside a function?
    • Example of how to use Conditional Compilation Macros in Rust
    • How many lines are covered by the Rust conditional compilation attribute?

    0 讨论(0)
提交回复
热议问题