如何提供 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;
,编译成功
我正在使用包含绑定到 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;
,编译成功