枚举内的条件编译

时间:2018-09-07 20:16:22

标签: rust

我有这样的东西:

#[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板条箱类型吗?在那种情况下,我不需要将此作为条件。


更新: 看来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;
}

2 个答案:

答案 0 :(得分: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板条箱类型吗?在那种情况下,我不需要将此作为条件。

不,您不能使用无法编译的板条箱。

答案 1 :(得分: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)
        }
    }
 }