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

Rust 将选项或结果传播到C代码的想法,rust,Rust,编写一个通过C互操作从C#调用的大型库。试图从一开始就获得一个干净的界面 我想知道是否有人有向c调用方传播选项或结果的想法。我喜欢生锈的方式,如果可能的话,我想保留这些语义。根据Stargateur的评论,你可以使用一些repr(C)struct和union组合。由于对union的一些限制,我们需要底层类型来实现Copy #[repr(C)] union COptionEnum<T> where T: Copy, { value: T, none: (), }

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


我想知道是否有人有向c调用方传播选项或结果的想法。我喜欢生锈的方式,如果可能的话,我想保留这些语义。

根据Stargateur的评论,你可以使用一些
repr(C)
struct和union组合。由于对
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>,
}

最后,您可以相对轻松地使用这些

#[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();
}
#[repr(C)]
#[衍生(复制、克隆)]
结构类型{
a:i32,
b:u64,
}
fn main(){
设v1=Some(类型{a:1,b:2});

让cv1:COption

你可以在一个结构中返回一个并集和一个判别式,手动实现enum。不幸的是,我不认为单位类型可以用C表示。我不知道C如何处理C调用,但除非C也有一种方法像Rust一样表示单位类型,也可以用C并集表示,我不确定这是可能的。(我还想知道为什么这段代码没有生成关于这一点的警告)“单位类型”-那是什么?我认为这是不可用的-你不能不损坏泛型你不能不损坏泛型,但你可能不能不损坏它,但这并不意味着你不能将它传递给C。或者至少传递一个指向C的指针,你可以在那里使用。如果你真的想传递对象,我认为你可以不添加任何损坏le到
#repr(透明)
包装结构。您可以在此处看到
#[repr(透明)]
版本的编译版本
#[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();
}