如何使用C++为V语言开发可调用模块,能否调用C++类方法?
C++开发V语言可调用模块实现指引
V本身原生支持调用C兼容的接口,C++代码需要先导出C风格的对外接口才能被V调用,具体步骤如下:
- 第一步:调整C代码,添加C兼容导出声明
你提供的示例代码需要补充extern "C"修饰符避免C名字粉碎,同时补全语法错误:
之后将C++代码编译为静态库或者动态库,比如Linux下用gcc编译为静态库:#ifdef __cplusplus extern "C" { #endif int some_method() { return 6; } #ifdef __cplusplus } #endifg++ -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代码里按照期望的方式调用了:
编译V代码的时候会自动链接你指定的C++库。import my_c_module fn main() { println(my_c_module.some_method()) // 输出6 }
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
相关产品推荐
相关产品推荐

