我在rust-bindgen的帮助下为一个C库编写了一个绑定,它的函数签名会自动生成到bindings.rs中,如下所示:
#[repr(C)]
struct A {
//...
}
struct B {
//...
}
extern "C" {
pub fn foo(x: *mut A, y: *mut B);
//...
}我对foo的这个签名不太满意,因为我知道x是一个指向常量结构的指针。此外,我想应用this idea来改进这个签名,如下所示
extern "C" {
pub fn foo(x: &'_ A, y: &'_ mut B);
}但是binding.rs有一堆像foo这样的函数,手动重写它们是一项非常耗时的任务,我认为宏(或其他东西)应该会有所帮助。例如,可能存在一个(或多个)魔术宏rewrite!
// hide
mod ffi {
include!("binding.rs"); // so bunch of functions: foo, bar
}
// re-exports
extern "C" {
rewrite!(foo); // should expand to: pub fn foo(x: &'_A, y: &'_ mut B)
rewrite!(bar);
}我正处于这项工作的早期阶段。我甚至不知道这样的问题是否可以通过宏或其他任何东西来解决,所以我正在寻找任何入口点。
我已经通过cross-posted this question访问了Rust用户论坛。
发布于 2019-06-27 22:21:49
声明性宏不能做到这一点,但过程性宏可以做到这一点。使用proc_macro2,您可以通过将重写属性放在令牌流上来修改函数声明的令牌流,例如
extern "C" {
#[rustify]
pub fn foo(x: *mut A, y: *mut B);
}您的rustify宏将用Option<&mut Typename>替换*mut Typename。
我不知道如何在不用*const替换原始声明的情况下立即更改mut borrow。
https://stackoverflow.com/questions/56786346
复制相似问题