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

Gre*_*reg 2 ffi extern rust

我有这些 C 文件,我想使用Rust 中的pair_add,add​​ 和。PAIR

加法器.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;
}
Run Code Online (Sandbox Code Playgroud)

加法器.h

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

int pair_add(PAIR * ppair);
int add(int, int);
Run Code Online (Sandbox Code Playgroud)

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

gcc -c adder.c
ar rc libadder.a adder.o  # Static link
Run Code Online (Sandbox Code Playgroud)

文档没有详细说明如何集成 C typedef 结构,示例适用于返回和接受的函数i32其他在线资源也很有限

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

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() {}
Run Code Online (Sandbox Code Playgroud)

Sta*_*eur 5

第一的:

typedef struct {
    int x;
    int y;
} PAIR;
Run Code Online (Sandbox Code Playgroud)

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

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

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;
}
Run Code Online (Sandbox Code Playgroud)

您可以轻松忽略 typedef 并仅用PAIR作该结构的名称。您甚至可以直接编写struct PAIR;使其不透明。

  • *使其不透明* - 我**不会**使用它来定义不透明类型。[另一个问答有建议](/sf/ask/2682076841/),但是`struct PAIR;`将允许*任何人*创建`PAIR`的实例,如果是的话就不应该允许不透明。 (2认同)