rust - 如何使用 Rust 中的 C typedef 结构和该结构的函数?

标签 rust extern ffi

我有这些 C 文件,我想使用 Rust 中的 pair_addaddPAIR

adder.c

#include <stdlib.h>
#include "adder.h"

int pair_add(PAIR * ppair) {
    return ppair->x + ppair->y;
}

int add(int x, int y) {
    return x + y;
}

adder.h

typedef struct {
    int x;
    int y;
} PAIR;

int pair_add(PAIR * ppair);
int add(int, int);

我使用以下方法编译它们:

gcc -c adder.c
ar rc libadder.a adder.o  # Static link

documentation没有详细说明如何集成 C typedef 结构和 the example适用于返回并接受 i32 的函数。 Other online resources were also limited .

我尝试了以下操作,但无法添加 PAIR typedef:

extern crate libc;

use libc::c_int;

#[link(name = "adder")]
extern "C" {
    // Define PAIR

    // int pair_add(PAIR * ppair);
    fn pair_add(input: Pair) -> c_int;

    // int add(int, int);
    fn add(input1: c_int) -> c_int;
}

fn main() {}

最佳答案

第一:

typedef struct {
    int x;
    int y;
} PAIR;

这声明了一个匿名结构,Rust 目前不支持。有一个RFC建议添加匿名类型。

其次,typedef 只是一个别名,结构的名称对于兼容并不重要。这意味着您可以简单地执行以下操作:

extern crate libc;
use libc::c_int;

#[repr(C)]
struct PAIR {
    x: c_int,
    y: c_int,
}

// optional "equivalent" of typedef
type Pair = PAIR;

extern "C" {
    fn pair_add(input: *mut Pair) -> c_int;
    // could be
    // fn pair_add(input: *mut PAIR) -> c_int;
}

您可以轻松忽略 typedef,只使用 PAIR 作为该结构的名称。您甚至可以只编写 struct PAIR; 来使其不透明。

关于rust - 如何使用 Rust 中的 C typedef 结构和该结构的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50618682/

相关文章:

rust - future.then() 如何返回一个 Future?

rust - impl 上的第一个显式生命周期说明符是什么意思?

rust - 如何在 WebAssembly 中从 Rust 返回一个字符串(或类似字符串)?

C - 使用 extern 访问全局变量。案例分析

c++ - 具有体面的 C++ FFI 的可破解方案实现

c - 如何在 Rust 中将 char** 转换为 Vec<String>

hashmap - 如何有效地从 HashMap 中查找和插入?

c++ - 为什么赋值不包括 extern 关键字和声明变量?

c - 这些 C 外部定义之间有什么区别?

在 Rust 中将 C 指针转换为结构