如何提供 extern "C" FFI 绑定的替代定义?

How can I provide an alternate definition of an extern "C" FFI binding?

我正在使用包含绑定到 extern "C" 函数的第 3 方库:

extern "C" {
    pub fn PageAddItemExtended(
        page: Page,
        item: Item,
        size: Size,
        offsetNumber: OffsetNumber,
        flags: ::std::os::raw::c_int,
    ) -> OffsetNumber;
}

Item 定义为 Pointer 类型,后者定义为 *mut ::std::os::raw::c_char。这个特殊的函数永远不会改变 Item 指向的数据,所以我想为它提供一个不可变的值。

如果我可以控制第 3 方库,我可以从 Item 的定义中省略 mut,一切都会好起来的,但我没有。

我尝试在没有 mut 的情况下添加此 extern "C" 函数的第二个定义,但它生成了此错误:

error[E0255]: the name `PageAddItemExtended` is defined multiple times
  --> src/segment/page.rs:49:5
   |
3  |   use crate::pg_sys::PageAddItemExtended;
   |       ---------------------------------- previous import of the value `PageAddItemExtended` here
...
49 | /     pub fn PageAddItemExtended(
50 | |         page: Page,
51 | |         item: *const ::std::os::raw::c_char,
52 | |         size: Size,
53 | |         offsetNumber: OffsetNumber,
54 | |         flags: ::std::os::raw::c_int,
55 | |     ) -> OffsetNumber;
   | |______________________^ `PageAddItemExtended` redefined here
   |
   = note: `PageAddItemExtended` must be defined only once in the value namespace of this module
help: you can use `as` to change the binding name of the import
   |
3  | use crate::pg_sys::PageAddItemExtended as OtherPageAddItemExtended;
   |   

这是有道理的;如果我的代码调用此函数,编译器将不知道要使用哪个定义。

这个问题有解决办法吗?以某种方式欺骗编译器使用不同的函数定义?

正如编译器所说,它失败了,因为 PageAddItemExtended 已经被定义了。省略前面的定义use crate::pg_sys::PageAddItemExtended;,编译成功