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::stringstd::vector

传参建议用 const char*intstruct(POD 类型)、指针等。

C 和 C++ 混合编译真正容易卡住的地方,往往不是 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后无法访问网络共享_共享权限设置方法【教程】  *服务器网站为何频现安全漏洞?