rust - 枚举中的条件编译

标签 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 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;
}

最佳答案

所以在 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)
        }
    }
 }

关于rust - 枚举中的条件编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52229131/

相关文章:

rust - 在将可变引用与自身映射时,存在生命周期要求冲突

string - Error::description 被软弃用是否意味着我必须重写我当前的错误消息系统?

json - 写入 JSON 文件时如何转义 PathBuf 变量中的反斜杠字符?

struct - 如何将一个结构向量映射或转换为另一个结构向量?

rust - 生命周期关闭捕获使用rust

arrays - 如何将sha256的前128位作为u128,而没有结果?

rust - 如何在 Rust 中递归复制文件夹?

rust - 解码存储在数据库中的数据

rust - 如何在 Rust 嵌套之外获取变量变化?

unit-testing - 如何编写 Rust 单元测试以确保发生 panic ?