rust 如何包含特定于平台的示例,或仅有条件地编译示例

olhwl3o2  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(165)

是否可以有条件地包含一个[[example]]?我有一个例子,它只运行在 *nix上,所以它会导致windows上的错误。
我试图避免在main.rs顶级项目上都编写#[cfg(not(target_family = "windows"))],并且我也不想损害代码结构(引入额外的模块)或扰乱IDE集成。
[[example]]更改为[[target.'cfg(not(target_family = "windows"))'.example]](在Cargo.toml中)不起作用。
#![cfg(not(target_family = "windows"))]添加到文件的顶部会导致:
机箱my_example中未找到main函数
添加#![cfg_attr(target_family = "windows", crate_type = "lib")]并不能解决这个问题,因为:
#![cfg_attr] attribute is deprecated中的crate_type
还尝试使用声明性宏,但它实际上不工作(似乎item不匹配mod规则),即使它确实工作,也不理想,因为它会扰乱IDE帮助。

macro_rules! no_windows {
    (
        $( x:item )*
    ) => {
        $(
            #[cfg(not(target_family = "windows"))]
            $x
        )*

        #[cfg(target_family = "windows")]
        fn main() {
            unimplemented!();
        }
    };
}

no_windows! {

// normal code here

}
af7jpaap

af7jpaap1#

也许有更好的办法,但像这样的应该行得通

#[cfg(not(target_family = "windows"))]
mod non_windows {
    // ...
    
    pub fn main() {
        // ...
    }
}

fn main() {
    #[cfg(not(target_family = "windows"))]
    non_windows::main();
}

相关问题