You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用C++为V语言开发可调用模块,能否调用C++类方法?

C++开发V语言可调用模块实现指引

V本身原生支持调用C兼容的接口,C++代码需要先导出C风格的对外接口才能被V调用,具体步骤如下:

  • 第一步:调整C代码,添加C兼容导出声明
    你提供的示例代码需要补充extern "C"修饰符避免C
    名字粉碎,同时补全语法错误:
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    int some_method() {
        return 6;
    }
    
    #ifdef __cplusplus
    }
    #endif
    
    之后将C++代码编译为静态库或者动态库,比如Linux下用gcc编译为静态库:
    g++ -c my_c_module.cpp -o my_c_module.o
    ar rcs libmy_c_module.a my_c_module.o
    
  • 第二步:编写V侧绑定模块
    新建my_c_module.v文件,内容如下:
    module my_c_module
    
    // 声明链接参数,指定要链接的C++库
    #flag -L. -lmy_c_module -lstdc++
    
    // 声明C侧导出的函数
    fn C.some_method() int
    
    // 对外暴露接口
    pub fn some_method() int {
        return C.some_method()
    }
    
  • 第三步:调用测试
    你就可以在你的V代码里按照期望的方式调用了:
    import my_c_module
    
    fn main() {
        println(my_c_module.some_method()) // 输出6
    }
    
    编译V代码的时候会自动链接你指定的C++库。
V语言调用C++类方法说明

V无法直接调用C的类成员方法,因为C类方法有隐含的this指针、存在名字粉碎机制,且语法特性不被C ABI兼容。你可以通过封装C风格接口的方式间接调用,示例如下:

  • C++侧封装代码:
    #include <cstdio>
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    // 先定义不透明的类指针类型
    typedef void* MyCppClass;
    
    // 封装构造函数
    MyCppClass my_cpp_class_new(int val) {
        return new MyClass(val);
    }
    
    // 封装类成员方法
    int my_cpp_class_get_val(MyCppClass instance) {
        return ((MyClass*)instance)->get_val();
    }
    
    // 封装析构函数
    void my_cpp_class_free(MyCppClass instance) {
        delete (MyClass*)instance;
    }
    
    #ifdef __cplusplus
    }
    #endif
    
    // 原始的C++类定义
    class MyClass {
    private:
        int val;
    public:
        MyClass(int v): val(v) {}
        int get_val() { return val; }
    };
    
  • V侧绑定代码:
    module my_c_module
    
    #flag -L. -lmy_c_module -lstdc++
    
    type C.MyCppClass = voidptr
    
    fn C.my_cpp_class_new(int) C.MyCppClass
    fn C.my_cpp_class_get_val(C.MyCppClass) int
    fn C.my_cpp_class_free(C.MyCppClass)
    
    // V侧可以进一步封装成结构体更符合V的使用习惯
    pub struct MyCppClass {
        inner C.MyCppClass
    }
    
    pub fn new_my_cpp_class(val int) MyCppClass {
        return MyCppClass{
            inner: C.my_cpp_class_new(val)
        }
    }
    
    pub fn (m &MyCppClass) get_val() int {
        return C.my_cpp_class_get_val(m.inner)
    }
    
    pub fn (m &MyCppClass) free() {
        C.my_cpp_class_free(m.inner)
    }
    
  • 调用示例:
    import my_c_module
    
    fn main() {
        cls := my_c_module.new_my_cpp_class(10)
        defer cls.free()
        println(cls.get_val()) // 输出10
    }
    

内容的提问来源于stack exchange,提问作者Peace

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 02:36:07