我想导出一个类似func<T, T>(T a, T b)的函数我得到一个错误,说no_mangle属性不能被添加到泛型函数。如果这不能直接完成,有没有一种间接的方法来将泛型函数暴露给C?到目前为止,我还没有能够想出一个解决方案
func<T, T>(T a, T b)
no_mangle
iyzzxitl1#
这是不可能的,C没有“泛型函数”的概念,C和Rust在链接之前都将函数单体化。正如注解中所建议的,你必须为你想从C/C调用的每对类型创建 Package 器,宏可以帮助减少样板:
fn func<T, U>(a: T, b: U) { } macro_rules! manual_mono { ($(($t:ty, $u:ty)),* $(,)?) => { $(paste::paste!( #[no_mangle] pub extern fn [< func_ $t _ $u >](a: $t, b: $u) { func::<$t, $u>(a, b) } );)* }; } manual_mono!( (i8, i8), (i16, i8), (i8, i16), (i16, i16), ); fn main() { func_i8_i8(0, 1); func_i16_i8(0, 1); // etc… }
字符串
1条答案
按热度按时间iyzzxitl1#
这是不可能的,C没有“泛型函数”的概念,C和Rust在链接之前都将函数单体化。正如注解中所建议的,你必须为你想从C/C调用的每对类型创建 Package 器,宏可以帮助减少样板:
字符串