rust - 如何将 C typedef 结构和函数与 Rust 中的该结构一起使用?
问题描述
我有这些 C 文件,我想使用pair_add
,add
和PAIR
来自 Rust。
加法器.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;
}
加法器.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
该文档没有详细说明如何集成 C typedef 结构,并且该示例适用于返回和接受的函数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() {}
解决方案
第一的:
typedef struct {
int x;
int y;
} PAIR;
这声明了一个匿名结构,目前 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;
}
您可以轻松地忽略 typedef 并仅用PAIR
作此结构的名称。您甚至可以只写struct PAIR;
使其不透明。
推荐阅读
- node.js - Node.js 中的 cron 作业是否会影响性能或产生内存泄漏等问题?
- android - 如何在firebase android中查询数据列表
- java - Springboot Application fails on DB restart
- c# - 表单关闭后未处理
- xcode - 这就是xcode的新特性,详情请看图
- java - 输入流在 Spring 到达 ASPECT 之前关闭
- php - 在 PHP 中多次运行相同代码的最佳方法是什么?
- linux - check_snmp_mem.pl 中的内存使用值是如何得出的?
- c# - 对话框的设计
- r - 在 R 中具有比例的逻辑回归(因变量不是二元的)。R在做什么?