C++程序要调用已经被编译后的C函数

在c++程序中调用被c编译器编译后的函数,为什么要加extern“c” C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。 假设某个C 函数的声明如下: void foo(int x, int y); 该函数被C 编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接。由于编译后的名字不同,C++程序不能直接调用C 函数。C++提供了一个C 连接交换指 阅读详情

C++程序不能直接调用已编译后的C函数的,这是因为名称问题,举个例,一个函数叫做void foo(int x, int y),该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接,名称就不一样,因此不能直接调用的。那要调用的话怎么办呢? C++提供了一个C连接交换指定符号***extern“C”***来解决这个问题。

extern “C”  
{   
void foo(int x, int y);   
…// 其它函数  
}   
extern “C”  
{   
#include “myheader.h”  
…// 其它C头文件  
}   

这就告诉C++编译译器,函数foo 是个C连接,应该到库中找名字_foo而不是找_foo_int_int。

//test.h
#ifdef __cplusplus
#include <iostream>
using namespace std;
extern "C"
{
#endif
void mytest();
#ifdef __cplusplus
}
#endif

可以将mytest()的实现放在.c或者.cpp文件中,可以在.c或者.cpp文件中include "test.h"后使用头文件里面的函数,而不会出现编译错误。

在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明? 首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。 通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该 阅读详情

相关推荐

深入解析磁盘性能测试:vdbench与fio的实战对比

本文深入对比了磁盘性能测试两大工具vdbench与fio的核心定位与实战应用。vdbench擅长多客户端、可编排的存储系统集成测试,而fio则以灵活的单机深度定制见长,是测试硬件极限和模拟特定应用IO模型的利器。文章通过安装指南、参数解析和典型场景对比,帮助读者根据需求选择合适工具,精准评估磁盘性能。

weixin_29300931的博客 323

在c++程序中调用被C编译器编译后的函数,为什么要使用extern “C”

c/c++函数调用约定:c/c++函数调用约定 一、原题: 二、详细说明: 现在,在一个工程中;有一个test.c文件;一个test1.cpp文件;//test.c#include<stdio.h>int Add(int a,int b) { return a+b; } (1)使用extern int Add(int,int);声明外部函数—–错误 //test1.cpp#inc

8512

Cesium生态盘点:超图、火星3D等15个二次开发框架对比

本文深入解析Cesium生态中的15个二次开发框架,包括超图、火星3D等主流选择,帮助开发者根据项目需求进行精准选型。从性能表现、功能完备性、开发友好度等维度进行对比,特别适合需要处理地理空间数据和构建三维可视化的JavaScript开发者。

weixin_28197941的博客 497

如何在C++中调用C函数?

标题 如何在C++中调用C函数? 假如在一个项目中同时包含了C和C++,当C++调用C函数时,以传统C编程#include "xxx.h"后,声明函数。由于main.cpp 是个C++代码,以C方式的调用,g++编译器无法通过编译。 解决方案一: 重写一个专门被c++用的头文件(可能存在是别人已经写好的头文件,我们无法修改等问题) e.g. 添加一个头文件 tansfer.h extern "C" { #include "file1.h" #include "file2.h" } 最后在需要调用C函数的c

Zander0的博客 7634

CarMaker快速入门

本合集是小明师兄推出的CarMaker汽车仿真,CarMaker无论是传统动力学、动力系统开发、底盘系统开发还是目前智能驾驶辅助系统及智能驾驶系统开发有着非常重要的作用,可以有效节省开发周期和开发成本,基于仿真快速实现算法开发和系统验证。...

小明师兄的博客 1万+

2021年J题:基于STM32F103的周期信号波形识别与参数测量系统设计(立创EDA+SZPT_ZXL)

本文详细复盘了2021年全国大学生电子设计竞赛J题获奖项目,手把手教你如何基于STM32F103微控制器设计并实现周期信号波形识别与参数测量系统。文章深入剖析了硬件电路设计(包括程控放大、工作点抬升与滞回比较器)与核心软件算法(如动态采样、FFT频谱分析与波形识别逻辑),并分享了DMA传输、FFT库使用等实战要点与避坑指南,为嵌入式信号处理与电赛备赛提供了宝贵经验。

weixin_32673065的博客 228

在C++程序中调用被C 编译器编译后的函数,为什么要加extern “C”?

extern是C/C++语言中表明函数和全局变量作用范围的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。 通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它...

Aaron_M的博客 1393

STM32H750VB与AD5292通讯,写入阻值后,AD5292 的阻值没有变化,如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1098

在C++程序中调用被C编译器编译后的函数(使用extern “C“),举例详细说明

在C++程序中调用被C编译器编译后的函数(使用extern “C“),举例详细说明

qq_35320456的博客 632

【软件定义汽车】-【架构篇】-全面讲解整车电子电气架构演进

前言: 前段时间,陆陆续续写了一些电子电气架构相关的文章。这里打算再写最后一篇作为收尾,为整个系列画上句号,把坑填上,这个话题就算过去了。后续一段时间,尽量把之前文章中挖的“坑”填一下。行文逻辑将借鉴5W2H进行。 另外,本文作为一篇整合性的文章,为保证逻辑的完整性,主要是将大量过去自己文章中的内容进行梳理整合,也存在很多行业内专家的公开文章的内容,请见谅。 WHAT1:什么是汽车电子电气架构? 电子电气架构:EEA,Electrical/Electronic Architecture.

零点壹客的博客 1万+

《QGIS快速入门与应用基础》209:重叠标注处理(移除/偏移)

系统讲解了QGIS中处理标注重叠问题的核心方法与实操流程。文章首先阐述了重叠标注处理的底层逻辑,即 先预防、再调整、后兜底 的递进式策略,并详细介绍了设置入口与界面布局。重点讲解了偏移处理这一首选方案,包括基础方向设置、最大偏移距离与步长配置、以及自动换行等进阶优化规则。针对不同要素类型(点、线、面)提供了行业规范的偏移方向设置建议,并给出从稀疏到密集场景的完整参数推荐值。最后以城市POI点图层为例,演示了5步偏移设置流程,帮助用户实现 无重叠、无压盖、重点突出 的专业标注效果。

LuckyHanMo的博客 670

C程序调用C++函数并使用gcc和g++编译链接

最近遇到这样一个场景:将dynamorio内置到QEMU模拟器中,能直接分析QEMU模拟出来的指令等信息。QEMU是用C语言写的,而dynamorio使用C++实现的,这就要涉及到用C程序(QEMU)调用C++(dynamorio)的函数。我们知道,C和C++的命名空间不同,函数编译出来的名字都不同,怎么去写程序和编译呢? 文章目录1. 编写demo2. 编写Makefile3. 编译执行4. 原理 1. 编写demo 一共三个文件testFunc.h、testFunc.cpp和main.c,用main.c

JaCenz的博客 1469

tsfknn 预测R语言中的时间序列

rolling参数应该设置为FALSE,这使得最后的18个观测值成为测试集,其余的作为训练集;如果我们将rolling参数设置为默认值TRUE,那么测试集就不会是一个恒定的向量。lag 滞后参数表示时间序列数据的滞后值。在这个例子中,由于我们的时间序列数据是月度的,我们将参数设置为1:12。作为药品福利计划的一部分,澳大利亚健康保险委员会记录的属于ATC代码A10的产品的每月政府支出(百万美元)。我们将使用tsfknn包,它可以用来预测R语言中的时间序列。格式:ts类别的月度时间序列。

Mrrunsen的博客 323

C程序调用C++库函数, C++动态库编译

C程序调用C++库函数 C++库编写 头文件 /* lsp.h start*/ #include #include <stdarg.h> using namespace std; class lsq { public: void debug(const char str); }; / lsp.h end*/ cpp文件 /* lsp.cpp start */ void lsq::...

联系方式:927632640 343

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

为什么c++程序调用c编译器编译的函数需要在调用前加上extern“C”

在最近的面试中,发现有无数的公司笔试题目都是来自林锐的《高质量C++编程指南》,其中就有如题目这样的一道题目,不一定是原话,但问题差不多,我的答案是c与c++的函数调用规则不一样。以下是林锐的答案:如果C++程序要调用已经被编译后的C 函数,该怎么办?假设某个C 函数的声明如下:void foo(int x, int y);该函数被C 编译器编译后在库中的名字为_foo,而C++编译器则会产生

ForNormandy的专栏 3779

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

在C++程序中调用被C编译器编译后的函数为什么要加extern“C”?

转自https://blog.youkuaiyun.com/ygm_linux/article/details/26626893 在C++程序中调用被C编译器编译后的函数为什么要加extern“C”?在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”? 首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编 译器,其声明的函数和变量可以在本模块或其它模块中使用。 通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声

weixin_45875586的博客 872

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C和C++代码混编时出现找不到C代码函数定义的问题

主函数是cpp文件,其他文件都是c文件,所以有上面题目。编译时,只要C++代码调用C代码就出现找不到函数定义问题。另一种解决办法是,将所有C源文件改为CPP文件。尝试将所有C头文件都在首尾加了。上面这篇文章讲得很明白了。

weixin_40194697的博客 972

如果 C++程序要调用已经被编译后的C 函数,该怎么办?extern "C"

假设某个C 函数的声明如下: void foo(int x, int y); 该函数被C 编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int 之类的名字用来支持函数重载和类型安全连接。由于编译后的名字不同,C++程序不能 直接调用C 函数

ToSoftWare的专栏 654

在C++ 程序中调用被 C 编译器编译后的函数库,为什么要加 extern “C”声明?

C++提供了C 连接交换指定符号extern“C”来解决名字匹配问题。

程序员的专栏 2336

在C++程序中调用被c编译器编译后的函数,为什么要加extern "C"?

http://blog.youkuaiyun.com/co0k1984/article/details/1467904 在C++程序中调用被c编译器编译后的函数,为什么要加extern "C"? C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。 假设某个C 函数的声明如下: void foo(int x, int y); 该函数被C 编译器编译后在库中

wjh199133的专栏 1163

在C++ 程序中调用被 C编译器编译后的函数,为什么被包含 extern "C"?

在C++程序中调用被C编译器编译后的函数,为什么被包含extern "C"? C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言不同。使用extern C可以解决名字匹配问题。 ...

qq_42685292的博客 198

Ubuntu 26.04远程桌面实测:RDP协议配置与Windows连接排错指南

远程桌面协议(RDP)是实现跨系统图形化操作的核心技术,其基于TLS加密和凭据校验机制保障连接安全。在Ubuntu 26.04中,系统原生采用GNOME远程桌面组件,通过RDP协议提供远程访问能力,但默认配置仅监听本地地址,需调整绑定地址并放行防火墙端口。实际部署中,认证失败、黑屏、分辨率错乱等问题常源于密钥环状态、会话冲突或网络可达性。本文基于完整实测链路,详解从系统端开启服务到Windows客户端连接的配置步骤与高频报错排查方法,帮助开发者快速打通跨平台远程桌面环境。

weixin_34038293的博客 414

C++程序调用已经被编译后的C函数

来自林锐的《高质量C++编程指南》答案:   如果C++程序要调用已经被编译后的C 函数,该怎么办?   假设某个C 函数的声明如下:   void foo(int x, int y);   该函数被C 编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接。由于编译后的名字不同,C++程序不能直接调用C 函数。C++提

Dream It Possible 1812

如果C++程序要调用已经被编译后的C函数,该怎么办?

C++语言支持函数重载,C 语言不支持函数重载。函数被C++编译后在库中的名字 与C 语言的不同。假设某个C函数的声明如下: void foo(int x, int y); 该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接。由于编译后的名字不同,C++程序不能直接调用C函数。C++提供了一个C连接交换指定符

学习是为了探索这个世界的本质 629
上一篇: 从C语言到C++
下一篇: window和linux下线程区别
Hello_World_10
博客等级 码龄8年 8粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值