如何将泛型rust函数导出到C++头文件?

zi8p0yeb  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(91)

我想导出一个类似func<T, T>(T a, T b)的函数
我得到一个错误,说no_mangle属性不能被添加到泛型函数。
如果这不能直接完成,有没有一种间接的方法来将泛型函数暴露给C?到目前为止,我还没有能够想出一个解决方案

iyzzxitl

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…
}

字符串

相关问题