0

0

C++如何进行跨语言调用?(与Rust或Go交互)

穿越時空

穿越時空

发布时间:2026-02-19 16:15:11

|

859人浏览过

|

来源于php中文网

原创

extern "c" 是跨语言调用唯一可靠起点,所有接口必须经 c abi 中转;参数返回值限 c 兼容类型,结构体需显式定义且无虚函数;rust/go 需配对内存管理函数确保所有权明确。

c++如何进行跨语言调用?(与rust或go交互)

extern "C" 暴露 C 兼容接口是唯一靠谱起点

所有跨语言调用都必须经过 C ABI 这一层中转,C++ 的 name mangling 和异常机制会直接让 Rust/Go 无法识别函数。不加 extern "C",连链接都会失败。

实操建议:

  • 只在头文件里用 extern "C" 声明函数,不要包裹整个实现文件
  • 函数参数和返回值只能是 C 兼容类型:intdoubleconst char*void*;避免 std::stringstd::vector、引用、重载
  • 如果要传结构体,必须用 struct 显式定义,并加 extern "C" 声明,且不能含虚函数、非 POD 成员
  • Rust 的 #[no_mangle] 和 Go 的 //export 注释也得配合同步处理

Rust 调用 C++ 时,cc crate 和 bindgen 怎么配合用

bindgen 只负责生成 Rust 的 FFI 绑定声明,它不编译 C++;真正编译和链接靠 cc crate(或手动写 build.rs 调用系统编译器)。两者缺一不可。

常见错误现象:

立即学习C++免费学习笔记(深入)”;

  • bindgen 生成的函数签名里出现 __0 后缀 —— 头文件没用 extern "C" 包裹,导致 C++ mangling 残留
  • Rust 编译报 undefined reference to 'xxx' —— cc 没正确编译 C++ 源码,或链接了 C++ 标准库(需加 -lstdc++-lc++
  • 运行时 panic: “attempted to leave type `std::string’ uninitialized” —— Rust 尝试 drop 了 C++ 分配但未导出释放逻辑的内存

关键点:C++ 侧必须提供 create_xxx()destroy_xxx() 配对函数,Rust 用 Box::from_raw/Box::into_raw 管理生命周期。

Molica AI
Molica AI

一款聚合了多种AI工具的一站式创作平台

下载

Go 调用 C++ 需绕过 cgo 的 C-only 限制

cgo 只认 C,不支持 C++ 语法。你不能在 /* #include "xxx.h" */ 里直接 include C++ 头文件,也不能在 import "C" 上方写 extern "C" 块。

正确路径只有一条:用一层纯 C 包装胶水代码。

  • 新建 cpp_wrapper.hcpp_wrapper.cpp,里面用 extern "C" 导出 C 函数,内部调用真正的 C++ 类和方法
  • Go 的 /* #include "cpp_wrapper.h" */ 只引用这个 C 头,不碰任何 C++ 关键字
  • CGO_LDFLAGS 必须显式加上 -lstdc++(Linux/macOS)或 -lc++(macOS Clang),否则链接失败
  • Go 中接收 *C.char 后,要用 C.GoString 转换,且不能直接 free —— 释放必须由 C++ 侧提供 free_string 这类函数

字符串和内存所有权最容易引发静默崩溃

跨语言边界的字符串不是“传过去就能用”,而是谁分配、谁释放、谁编码(UTF-8?locale?)都要提前约定死。一个 const char* 指针背后,可能藏着栈变量、静态缓冲区、堆内存三种生命周期。

实操建议:

  • 避免返回局部 std::string.c_str() —— 函数返回后指针悬空
  • 如需返回字符串,C++ 侧用 malloc 分配,Rust/Go 调用后调用对应 free;或改用输出参数(char* buf, size_t buf_len
  • Rust 中用 CStr::from_ptr 读取前,先确认 C++ 侧以 \0 结尾;Go 中 C.GoString 会复制,但若 C++ 返回的是非 null-terminated 字节数组,就得用 C.GoStringN
  • 所有跨语言传递的结构体指针,必须配套 new_XXX/delete_XXX 函数,禁止在 Go/Rust 里 unsafe 自由转换

边界越模糊的地方,越容易在压测或特定输入下突然崩掉——比如某个字符串恰好含 \0,或者某次分配刚好触发了 C++ 侧的 move 语义,而 Rust 还以为自己持有原对象。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全

C++系统编程中的内存管理是指 对程序运行时内存的申请、使用和释放进行精细控制的机制,涵盖了栈、堆、静态区等不同区域,开发者需要通过new/delete、智能指针或内存池等方式管理动态内存,以避免内存泄漏、野指针等问题,确保程序高效稳定运行。它核心在于开发者对低层内存有完全控制权,带来灵活性,但也伴随高责任,是C++性能优化的关键。

13

2025.12.22

Rust异步编程与Tokio运行时实战
Rust异步编程与Tokio运行时实战

本专题聚焦 Rust 语言的异步编程模型,深入讲解 async/await 机制与 Tokio 运行时的核心原理。内容包括异步任务调度、Future 执行模型、并发安全、网络 IO 编程以及高并发场景下的性能优化。通过实战示例,帮助开发者使用 Rust 构建高性能、低延迟的后端服务与网络应用。

5

2026.02.11

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

770

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

245

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

786

2024.03.01

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

547

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

573

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

216

2023.09.04

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

660

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 5.3万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号