gpt4 book ai didi

rust - 枚举中的条件编译

转载 作者:行者123 更新时间:2023-11-29 08:32:24 25 4
gpt4 key购买 nike

我有这样的东西:

#[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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com