我正在编写一些代码来连接用C编写的现有库.在我的Rust代码中,我希望能够使用CPP宏中的值.如果我有一个C.h看起来像这样:

#define INIT_FLAG 0x00000001

我希望能像这样在Rust 的地方使用它:

#[link(name="mylib")]
extern {
    pub static init_flag: c_int = INIT_FLAG;
}

我看过其他的 foreign 金融机构代码,我看到很多人

推荐答案

这是不可能的,我认为这在future 是不可能的.C宏带来了太多的问题.如果你想在 rust 源上运行cpp次,你可以手动运行.

如果你不想这样做,如果有很多常量,你也不想把它们的值从C代码复制到Rust,你可以制作一个C包装器,它将提供带有这些值的全局变量:

#define INIT_FLAG 0x00000001

...

const int init_flag = INIT_FLAG;

编译此文件,从中创建静态库,并像往常一样链接到它:

$ gcc -c init_flag.c
$ ar r libinitflag.a init_flag.o

rust 源:

use std::libc;

#[link(name="initflag", kind="static")]
extern {
    pub static init_flag: libc::c_int;
}

rust 源几乎与您试图实现的目标相同.不过,您需要C glue对象文件.

Rust相关问答推荐

无需通过ASIO输入音频,并使用cpal进行反馈示例

使用Rust s serde_json对混合数据类型进行优化'

如何将元素添加到向量并返回对该元素的引用?

创建包含缺失值的框架

在特征中使用Async时,如何解决不透明类型`impl Future<;out=self>;`不满足其关联的类型边界和警告?

在执行其他工作的同时,从共享裁判后面的VEC中删除重复项

制作一片连续整数的惯用Rust 方法?

在文件链实施中绕过borrow 判断器

在复制类型中使用std::ptr::WRITE_VILAR进行内部可变性的安全性(即没有UnSafeCell)

不同类型泛型的映射

Rust 中什么时候可以返回函数生成的字符串切片&str?

如何返回 struct 体中向量的切片

使用 Option 来分配?

实现AsyncWrite到hyper Sender时发生生命周期错误

如何在 Rust 中显式声明 std::str::Matches<'a, P> ?

由特征键控的不同 struct 的集合

Rust 中函数的类型同义词

匹配结果时的简洁日志(log)记录

Rust 内联 asm 中的向量寄存器:不能将 `Simd` 类型的值用于内联汇编

如何将 u8 切片复制到 u32 切片中?