Binding 如何自动重写bindgen创建的FFI函数的签名?

Binding 如何自动重写bindgen创建的FFI函数的签名?,binding,rust,ffi,Binding,Rust,Ffi,我在rust bindgen的帮助下为C库编写了一个绑定,函数签名自动生成为bindings.rs,如下所示: #[repr(C)] 结构A{ //... } 结构B{ //... } 外部“C”{ pub fn foo(x:*mut A,y:*mut B); //... } 我对foo的签名不太满意,因为我知道x是指向常量结构的指针。此外,我想申请将此签名改进为 extern“C”{ 酒吧fn foo(x:&uu'A,y:&uu'mut B); } 但是binding.rs有一系列类似fo

我在
rust bindgen
的帮助下为C库编写了一个绑定,函数签名自动生成为
bindings.rs
,如下所示:

#[repr(C)]
结构A{
//...
}
结构B{
//...
}
外部“C”{
pub fn foo(x:*mut A,y:*mut B);
//...
}
我对
foo
的签名不太满意,因为我知道
x
是指向常量结构的指针。此外,我想申请将此签名改进为

extern“C”{
酒吧fn foo(x:&uu'A,y:&uu'mut B);
}
但是
binding.rs
有一系列类似
foo
的函数,手工重写它们是一项非常耗时的任务,我认为宏(或其他东西)应该会有所帮助。例如,可能存在一个(或多个)魔术宏
rewrite


//隐藏
mod ffi{
include!(“binding.rs”);//所以函数组:foo,bar
}
//转口
外部“C”{
重写!(foo);//应该扩展到:pub fn foo(x:&“u A,y:&”mut B)
重写!(酒吧);
}
我正处于这项工作的早期阶段。我甚至不知道这样的问题是否可以通过宏或任何其他方法解决,所以我正在寻找任何切入点


我已经访问了Rust用户论坛。

声明性宏无法完成此任务,但过程性宏可能能够完成此任务。使用,您可以通过将重写属性放置在函数声明的令牌流上来修改它,例如

extern“C”{
#[生锈]
pub fn foo(x:*mut A,y:*mut B);
}
您的
rustify
宏将用
选项替换
*mut Typename


我不知道如果不将原始声明替换为proc_macro2,您将如何立即更改
mut
借用-不需要使用此板条箱,这只是与令牌流交互的最常用方法之一。@myrrlyn谢谢您。我还不熟悉
proc_macro2
,但是非常感谢您的入门指导。为什么不为它编写一个包装器呢?@hellow谢谢您。你能详细说明一下吗?对不起我的新手。