C++中extern "C"的作用是什么?(实现C和C++混合编译)
发布时间 - 2026-01-23 00:00:00 点击率:次extern "C" 解决C++与C混合编译的函数名修饰问题,防止C++编译器对C函数进行name mangling,确保符号匹配;需包裹头文件或单个函数声明,且不适用于模板、inline函数、成员函数及非C兼容类型。
extern "C" 解决的是函数名修饰问题
C++ 支持函数重载,编译器在生成目标文件时会对函数名做 name mangling(名字修饰),比如 void foo(int) 可能变成 _Z3fooi;而 C 语言不重载,函数名在符号表里就是原样 foo。如果 C++ 代码直接调用 C 编译出来的库(如 libc 或自写 .a/.so),链接器找不到匹配的符号,就会报 undefined reference to 'foo' 这类错误。
在 C++ 中声明 C 函数必须用 extern "C"
告诉 C++ 编译器:这部分声明不要做 name mangling,按 C 的规则导出/导入符号。常见写法:
extern "C" {
#include
#include "my_c_header.h"
}
或者单个函数:
extern "C" void c_function(int x);
注意:extern "C" 是 C++ 语法,不能写在纯 C 文件里(会编译失败);#include 必须放在 extern "C" 块内才生效。
C 头文件要兼容 C++ 时需加条件宏
如果你写的 C 库希望同时被 C 和 C++ 项目包含,头文件开头要加:
#ifdef __cplusplus
extern "C" {
#endif
// 函数声明
void my_util_func
(double);
#ifdef __cplusplus
}
#endif
否则 C++ 项目 #include 该头文件时,函数仍会被 mangling,链接失败。很多系统头文件(如 string.h)都这么处理。
extern "C" 不能修饰模板或内联函数
extern "C" 要求符号名唯一且无重载语义,所以:
- 不能用于 C++ 模板函数(实例化后有多个符号)
- 不能用于
inline函数(通常不生成外部符号) - 不能用于类成员函数(C 没有类概念)
- 参数类型必须是 C 兼容类型(比如不能传
std::string、std::vector)
传参建议用 const char*、int、struct(POD 类型)、指针等。
extern "C" 写没写,而是头文件是否被正确包裹、C 库是否真的用 C 编译器(而非 g++)生成、以及结构体对齐或 ABI 版本不一致导致的运行时崩溃。
# c++
# String
# 成员函数
# include
# const
# extern
# 结构体
# char
# int
# void
# 指针
# Struct
# 函数重载
# undefined
# 头文件
# 会报
# 的是
# 放在
# 多个
# 找不到
# 这部
# 这类
# 要做
# 而非
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
Laravel如何实现API资源集合?(Resource Collection教程)
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
C语言设计一个闪闪的圣诞树
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
php json中文编码为null的解决办法
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
如何用JavaScript实现文本编辑器_光标和选区怎么处理
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
Laravel如何处理和验证JSON类型的数据库字段
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
如何快速搭建安全的FTP站点?
EditPlus中的正则表达式实战(6)
如何正确选择百度移动适配建站域名?
C++时间戳转换成日期时间的步骤和示例代码
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
Python高阶函数应用_函数作为参数说明【指导】
Laravel中的withCount方法怎么高效统计关联模型数量
香港服务器如何优化才能显著提升网站加载速度?
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
QQ浏览器网页版登录入口 个人中心在线进入
西安专业网站制作公司有哪些,陕西省建行官方网站?
如何在万网利用已有域名快速建站?
如何破解联通资金短缺导致的基站建设难题?
Java垃圾回收器的方法和原理总结
javascript如何操作浏览器历史记录_怎样实现无刷新导航
iOS验证手机号的正则表达式
原生JS实现图片轮播切换效果
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
javascript基本数据类型及类型检测常用方法小结
详解Android——蓝牙技术 带你实现终端间数据传输
Android自定义listview布局实现上拉加载下拉刷新功能
如何确认建站备案号应放置的具体位置?
如何批量查询域名的建站时间记录?
如何在橙子建站中快速调整背景颜色?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
Laravel中的Facade(门面)到底是什么原理
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
phpredis提高消息队列的实时性方法(推荐)
香港服务器网站卡顿?如何解决网络延迟与负载问题?
音乐网站服务器如何优化API响应速度?
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
如何续费美橙建站之星域名及服务?
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】
php打包exe后无法访问网络共享_共享权限设置方法【教程】
*服务器网站为何频现安全漏洞?


