如何将Rust泛型函数导出到C++头文件?遇no_mangle报错求解
泛型函数暴露给C的间接实现方案
直接给泛型函数添加#[no_mangle]会报错,核心原因是泛型函数本身是编译期生成具体代码的模板,而非一个确定的函数实体,no_mangle要求对应唯一的固定符号,两者逻辑冲突。
要间接把泛型函数的能力暴露给C,可行的方案是利用Rust的静态单态化特性,为每个需要的具体类型编写非泛型的包装函数,通过这些包装函数导出给C:
- 先定义不带
no_mangle的泛型函数:
fn func<T: std::ops::Add<Output = T>>(a: T, b: T) -> T { a + b }
- 为每个需要暴露给C的具体类型,编写对应的包装函数,添加
#[no_mangle]和extern "C"标识:
#[no_mangle] extern "C" fn func_i32(a: i32, b: i32) -> i32 { func(a, b) } #[no_mangle] extern "C" fn func_f64(a: f64, b: f64) -> f64 { func(a, b) }
- C侧可以直接调用这些具体的导出函数:
#include <stdio.h> extern int func_i32(int a, int b); extern double func_f64(double a, double b); int main() { printf("%d\n", func_i32(1, 2)); printf("%lf\n", func_f64(1.5, 2.5)); return 0; }
这种方式本质是把Rust编译时为泛型生成的单态化函数,通过非泛型包装器映射为C能识别的固定符号。需要注意的是,必须为每一种需要在C中使用的类型单独编写包装函数,因为C本身不支持泛型,无法动态适配类型。
内容的提问来源于stack exchange,提问作者user1916672
相关产品推荐
相关产品推荐

