我有这样的东西:
#[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;
}
答案 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)
}
}
}