全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++如何调用C语言函数?(extern "C"用法)

C++调用C函数需用extern "C"解决名称修饰问题:在头文件中用#ifdef __cplusplus extern "C" { #endif包裹声明,或在C++源文件中用extern "C"包含C头文件/定义函数。

在C++中调用C语言函数,核心是解决C++的名称修饰(name mangling)问题。C++编译器会对函数名按参数类型、返回值等信息做编码,而C编译器只保留原始函数名。如果不加处理,链接时会找不到符号。解决方法就是用 extern "C" 告诉C++编译器:“这个函数按C的方式命名和链接”。

在C++代码里声明C函数(最常见场景)

当你有现成的C头文件(比如 math.h 或自定义的 utils.h),又想在C++里用其中的函数,需要把C头文件的声明“包裹”进 extern "C" 块:

  • 直接包含系统C头文件一般不用改(如 #include ),因为标准头通常已内置了 extern "C" 判断
  • 但自己写的C头文件,建议在头文件内部加保护性写法,方便C/C++都能安全包含:
// utils.h
#ifndef UTILS_H
#define UTILS_H

ifdef __cplusplus

extern "C" {

endif

int add(int a, int b); // C函数声明 void print_message(const char* s);

ifdef __cplusplus

}

endif

endif

这样C++源文件只需 #include "utils.h" 就能直接调用 add()print_message(),无需额外修饰。

在C++中定义供C调用的函数

如果你在C++源文件里写了一个函数,希望让C代码也能调用它,必须用 extern "C" 修饰函数定义(或声明):

  • 只能用于函数,不能用于类、模板、重载函数
  • 不支持C++特性:不能有默认参数、引用、类对象参数/返回值、异常说明等
// helper.cpp
extern "C" {
    int multiply(int x, int y) {
        return x * y;
    }
void log_info(const char* msg) {
    printf("[INFO] %s\n", msg);
}

}

然后在C文件中声明并调用即可:

// main.c
extern int multiply(int, int);
extern void log_info(const char*);

int main() { int r = multiply(6, 7); log_info("done"); return 0; }

单个函数临时声明(不改头文件时用)

如果无法修改C头文件(比如第三方闭源库只有 .h + .lib),可在C++源文件中手动加 extern "C" 声明:

// main.cpp
extern "C" {
#include "legacy_api.h"  // 假设这个头文件没加 __cplusplus 判断
}

int main() { legacy_init(); // 正常调用 return 0; }

注意:extern "C" 块内不能出现C++特有语法(如类、new、模板),所以只适合纯C风格头文件。

基本上就这些。关键就两点:头文件里加 __cplusplus 宏判断 + extern "C" 包裹;或者在C++源码里显式用 extern "C" 声明/定义。不复杂但容易忽略。


# c语言  # 编码  # ai  # c++  # 解决方法  # include  # math  # extern  # 重载函数  # 对象  # 头文件  # 里加  # 返回值  # 就能  # 都能  # 找不到  # 你在  # 也能  # 只需  # 你有 


相关文章: 香港服务器租用费用高吗?如何避免常见误区?  如何基于云服务器快速搭建个人网站?  常州自助建站费用包含哪些项目?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  MySQL查询结果复制到新表的方法(更新、插入)  如何确保西部建站助手FTP传输的安全性?  如何用免费手机建站系统零基础打造专业网站?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  建站之星客服服务时间及联系方式如何?  制作网站怎么制作,*游戏网站怎么搭建?  香港服务器如何优化才能显著提升网站加载速度?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  红河网站制作公司,红河事业单位身份证如何上传?  如何挑选优质建站一级代理提升网站排名?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  C#怎么使用委托和事件 C# delegate与event编程方法  如何在香港免费服务器上快速搭建网站?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  PHP 500报错的快速解决方法  高端建站如何打造兼具美学与转化的品牌官网?  网站好制作吗知乎,网站开发好学吗?有什么技巧?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何通过虚拟主机空间快速建站?  如何在Golang中指定模块版本_使用go.mod控制版本号  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  ,南京靠谱的征婚网站?  建站之星24小时客服电话如何获取?  如何在企业微信快速生成手机电脑官网?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  制作网站的软件免费下载,免费制作app哪个平台好?  如何彻底卸载建站之星软件?  建站主机与虚拟主机有何区别?如何选择最优方案?  在线教育网站制作平台,山西立德教育官网?  如何通过万网虚拟主机快速搭建网站?  如何制作一个表白网站视频,关于勇敢表白的小标题?  创业网站制作流程,创业网站可靠吗?  建站主机选虚拟主机还是云服务器更好?  定制建站是什么?如何实现个性化需求?  如何设计高效校园网站?  如何在万网开始建站?分步指南解析  公司网站制作价格怎么算,公司办个官网需要多少钱?  金*站制作公司有哪些,金华教育集团官网?  西安专业网站制作公司有哪些,陕西省建行官方网站?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  西安大型网站制作公司,西安招聘网站最好的是哪个?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  如何快速查询域名建站关键信息?  如何通过cPanel快速搭建网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。