gpt4 book ai didi

rust - 将选项或结果传播到 C 代码的想法

转载 作者:行者123 更新时间:2023-12-03 11:26:32 25 4
gpt4 key购买 nike

编写一个将通过 C 互操作从 C# 调用的大型库。尝试从一开始就获得一个干净漂亮的界面。

我想知道是否有人有将 Option 或 Result 传播给 c 调用者的想法。我喜欢使用rust 的方式,如果可能的话,我想保留这些语义。

最佳答案

根据 Stargateur 的评论,您可以使用一些 repr(C) 结构和联合组合。由于 union 的一些限制,我们需要底层类型来实现 Copy

#[repr(C)]
union COptionEnum<T>
where
T: Copy,
{
value: T,
none: (),
}

#[repr(C)]
struct COption<T>
where
T: Copy,
{
discriminant: u32,
value: COptionEnum<T>,
}

但是这些并不是特别符合人体工程学,所以为了减轻痛苦,您可以提供与 Option 之间的转换。这些看起来像这样:

impl<T> From<Option<T>> for COption<T>
where
T: Copy,
{
fn from(v: Option<T>) -> COption<T> {
match v {
None => COption {
discriminant: 0,
value: COptionEnum { none: () },
},
Some(v) => COption {
discriminant: 1,
value: COptionEnum { value: v },
},
}
}
}

impl<T> From<COption<T>> for Option<T>
where
T: Copy,
{
fn from(v: COption<T>) -> Option<T> {
match v.discriminant {
0 => None,
1 => Some(unsafe { v.value.value }),
_ => panic!("Invalid COption"),
}
}
}

最后,您可以以相对轻松的方式使用它们。

#[repr(C)]
#[derive(Copy, Clone)]
struct AType {
a: i32,
b: u64,
}

fn main() {
let v1 = Some(AType { a: 1, b: 2 });
let cv1: COption<AType> = v1.into();
let w1: Option<AType> = cv1.into();
}

完整副本在 playground

关于rust - 将选项或结果传播到 C 代码的想法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63222562/

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