【问题标题】:How does a repr(C) type handle Option?repr(C) 类型如何处理选项?
【发布时间】:2016-12-24 17:05:18
【问题描述】:

我有这个 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 在这里。显然Rustenum和C指针在位级别上不是一回事,那么Rust编译器是如何处理的呢?

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

【问题讨论】:

    标签: rust


    【解决方案1】:

    来自The Rust Programming Language chapter on FFI(强调我的):

    某些类型被定义为不为空。这包括引用(&amp;T&amp;mut T)、框(Box&lt;T&gt;)和函数指针(extern "abi" fn())。在与 C 接口时,经常使用可能为空的指针。作为一种特殊情况,一个包含两个变体的通用枚举,其中一个不包含数据,另一个包含单个字段,符合“可空指针优化”的条件。当使用其中一种不可为空的类型实例化此类枚举时,它表示为单个指针,而非数据变体表示为空指针。 所以Option&lt;extern "C" fn(c_int) -&gt; c_int&gt; 是如何使用 C ABI 表示可空函数指针。

    换一种说法:

    显然,Rust 枚举和 C 指针在位级别上不是一回事

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


    另见:

    【讨论】:

      猜你喜欢
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      相关资源
      最近更新 更多