枚举内的条件编译

问题描述 投票:0回答:2

我有这样的事情:

#[macro_use]
extern crate quick_error;

#[cfg(target_os = "linux")]
#[macro_use]
extern crate nix;

quick_error! {
    #[derive(Debug)]
    pub enum Error {
        DeviceNotFound{
            description("Could not find a ledger device")
        }
        Ioctl ( err: nix::Error ) {
            from()
            description("ioctl error")
            display("ioctl error: {}", err)
            cause(err)
        }
    }
 }

我的问题是nix只能在linux中使用。

我怎样才能使Ioctl成为linux的条件?或者这是一个坏主意?

我想知道Rust的推荐方法是什么。

另一种方法是:只要我不使用任何函数/方法,即使在Windows中也可以使用nix crate类型吗?在这种情况下,我不需要使这条件有条件。


更新:似乎from()线与问题有关。

@Stargateur肯定适用于大多数情况,但不适用于我的具体问题。我在这里添加一个Example code

#[macro_use]
extern crate quick_error;

quick_error! {
    #[derive(Debug)]
    pub enum Error {
        DeviceNotFound{
            description("Could not find a ledger device")
        }
        #[cfg(target_os = "windows")]
        Ioctl ( err: nix::Error ) {
            from()
            description("ioctl error")
            display("ioctl error: {}", err)
            cause(err)
        }
    }
 }

 fn main() {
    let _ = Error::DeviceNotFound;
}
rust
2个回答
0
投票

所以在quickerror中使用条件编译是不可能的。经过一些实验,我想出了在不存在的平台上模拟类型的想法:

#[macro_use]
extern crate quick_error;
#[macro_use]
extern crate cfg_if;

cfg_if! {
    if #[cfg(target_os = "linux")] {
        extern crate nix;
    } else {
        // Mock the type in other target_os
        mod nix {
            quick_error! {
                #[derive(Debug)]
                pub enum Error {}
            }
        }
    }
}

quick_error! {
    #[derive(Debug)]
    pub enum Error {
        DeviceNotFound{
            description("Could not find a ledger device")
        }
        Ioctl ( err: nix::Error ) {
            from()
            description("ioctl error")
            display("ioctl error: {}", err)
            cause(err)
        }
    }
 }

0
投票

如何让Ioctl成为linux的条件?

通常,你可以把#[cfg(target_os = "linux")]放在前面:

#[cfg(target_os = "linux")]
Ioctl(err: nix::Error) {
    from()
    description("ioctl error")
    display("ioctl error: {}", err)
    cause(err)
}

但它看起来像quick_error不支持它,所以你可以在github上打开一个请求功能,但是箱子不是非常活跃(没有冒犯)或者你可能只是不使用这个箱子并且“手动”执行你的错误类型。

我想知道Rust的推荐方法是什么。

这是基于意见的,随心所欲。

另一种方法是:只要我不使用任何函数/方法,即使在Windows中也可以使用nix crate类型吗?在这种情况下,我不需要使这条件有条件。

不,你不能使用不编译的箱子。

© www.soinside.com 2019 - 2024. All rights reserved.