如何设置 cfg 选项以有条件地编译?

2 conditional-compilation rust

我正在处理一些代码,其中缓冲区由静态大小的数组支持。由于 Rust 和它提供的构建工具提供了有条件编译的可能性,我可以这样做:

struct Buffer {
    // default case, if none is set
    #[cfg(not(buffersize))]
    buffer: [f32; 16],

    #[cfg(buffersize = "32")]
    buffer: [f32; 32],

    #[cfg(buffersize = "64")]
    buffer: [f32; 64],
}

impl Buffer {
    fn new() -> Buffer {
        Buffer {
            #[cfg(not(buffersize))]
            buffer: [0.0; 16],

            #[cfg(buffersize = "32")]
            buffer: [0.0; 32],

            #[cfg(buffersize = "64")]
            buffer: [0.0; 64],
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一个问题是使用特性有条件地编译代码。单独使用功能,我必须结合buffersize实际值,例如buffersize16. 是否可以将cfg标志提供给 Cargo,或者我是否需要直接将它们提供给rustc

mpr*_*net 5

您可以设置环境变量RUSTFLAGSrustflags.cargo/config.
来自环境变量

RUSTFLAGS — 以空格分隔的自定义标志列表,要传递给 Cargo 执行的所有编译器调用。与货物 rustc 相比,这对于将标志传递给所有编译器实例很有用。

在您的示例中,您可以使用:

RUSTFLAGS='--cfg buffersize="32"' cargo build
Run Code Online (Sandbox Code Playgroud)