Как использовать структуру typedef C и функции с этой структурой из Rust? - PullRequest
0 голосов
/ 31 мая 2018

У меня есть эти C-файлы, и я хочу использовать pair_add, add и PAIR из Rust.

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

Документация не описывает, как интегрировать структуры typedef Cи пример предназначен для функций, которые возвращают и принимают i32. Другие онлайн-ресурсы также были ограничены .

Я попытался выполнить следующее, но не смог добавить 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() {}

1 Ответ

0 голосов
/ 31 мая 2018

Первый:

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;, чтобы сделать его непрозрачным.

...