gpt4 book ai didi

macros - 如何将 C 预处理器宏与 Rust 的 FFI 一起使用?

转载 作者:行者123 更新时间:2023-11-29 07:42:38 26 4
gpt4 key购买 nike

我正在编写一些代码来连接用 C 编写的现有库。在我的 Rust 代码中,我希望能够使用 CPP 宏中的值。如果我有一个如下所示的 C include.h:

#define INIT_FLAG 0x00000001

我希望能够像这样在 Rust 中使用它:

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

我看过其他 FFI 代码,我看到很多人在 Rust 中复制这些值而不是从 FFI 中获取它们。这似乎有点脆弱,我也希望能够处理通过 CPP 宏定义的更复杂的东西。在我的 Rust 文件上运行 cpp 只有在我确定我的CPP 宏仅用于简单的事情。

最佳答案

不可能,以后也不可能了。 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 胶水对象文件。

关于macros - 如何将 C 预处理器宏与 Rust 的 FFI 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21485655/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com