繁体   English   中英

repr(C)类型如何处理Option?

[英]How does a repr(C) type handle Option?

我有这个C代码:

typedef void (*f_t)(int a);

struct Foo {
        f_t f;
};

extern void f(struct Foo *);

bindgen生成以下Rust代码(我已经删除了不重要的细节):

#[repr(C)]
#[derive(Copy, Clone)]
#[derive(Debug)]
pub struct Foo {
    pub f: ::std::option::Option<extern "C" fn(a: ::std::os::raw::c_int)>,
}

我不明白为什么Option在这里。 显然,Rust enum和C指针在位级别上是不同的,那么Rust编译器如何处理呢?

当我调用C f函数并将指针传递给Rust结构Foo ,编译器是否将Foo_rust转换为Foo_C ,然后仅将指向Foo_C的指针Foo_Cf

关于FFI (重点是我的) 的Rust编程语言一章

某些类型定义为不为null。 这包括引用( &T&mut T ),框( Box<T> )和函数指针( extern "abi" fn() )。 与C接口时,经常使用可能为null的指针。 作为一种特殊情况,一个通用枚举恰好包含两个变体,其中一个不包含数据,另一个不包含单个字段,则可以使用“空指针优化”。 当使用非空类型之一实例化此类枚举时,它表示为单个指针,非数据变量表示为空指针。 因此, Option<extern "C" fn(c_int) -> c_int>是如何使用C ABI表示可为空的函数指针。

换句话说:

显然,Rust枚举和C指针在位级别上是不同的

Option包含一组特定类型时,它们实际上就是。


也可以看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM