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

C++入门>>连接规范---extern “C“ 文章目录前言:背景内部名称修饰extern “C”C++项目调用C静态库C静态库的生成C++项目中C静态库的包含于配置、包含配置一配置二效果C项目调用C++库C++静态库的生成效果总结 前言: 本文介绍C++程序中的连接规范》》extern “C” 博主收集的资料New Young,连载中。 博主收录的问题:New Young 转载请标明出处:New Young 背景 在使用不同编程语言进行软件的开发时,需要统一变量,函数名等的链接规范。 如果C++项目中包含C静态库或者动 阅读详情

在最近的面试中,发现有无数的公司笔试题目都是来自林锐的《高质量C++编程指南》,其中就有如题目这样的一道题目,不一定是原话,但问题差不多,我的答案是c与c++的函数调用规则不一样。以下是林锐的答案:

如果C++程序要调用已经被编译后的C 函数,该怎么办?
假设某个C 函数的声明如下:
void foo(int x, int y);
该函数被C 编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接。由于编译后的名字不同,C++程序不能直接调用C 函数。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。C++编译器开发商已经对C 标准库的头文件作了extern“C”处理,所以
我们可以用#include 直接引用这些头文件。

extern “C“ 怎么使用? 函数前加 extern 是什么意思? 深度理解 C++ 与 C 代码之间的互操作性 C++ 代码(library.cpp)C 语言代码(main.c)// main.c// 声明 C++ 函数return 0;编译和链接# 编译 C++ 代码 g++ -c library.cpp -o library.o # 编译 C 代码 gcc -c main.c -o main.o # 链接生成可执行文件 g++ main.o library.o -o my_program运行my_program用途extern "C" 阅读详情

相关推荐

C++中extern “C”深层探索

C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同。C引用C++函数例子工程中包含的三个文件的源代码如下://C++头文件 cppExample.h#endif。

程序猿老樊的博客 854

c语言函数申明加extern,C++-输出函数声明前加extern

1: extern "C"的含义extern "C" 包含双重含义,从字面上看:首先,被它修饰的目标是"extern"的; 其次,被它修饰的目标是"C"的. 被extern "C"限定的函数或变量是extern类型的;extern 是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。语句: extern int a; ...

weixin_33656931的博客 2281

在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 连接交换指

qq_36992917的博客 926

C/C++常见面试题整理

前段时间有不少同学在后台问是否有C/C++相关面试题,本人近半年基本上都是在C/C++开发,我也在不断学习和总结着,C/C++有一些非常有意思的点,不同于Java及C#。尤其是C++11,C++14,C++17越来越丰富了C++语言。C++修炼要比Java及C#要长。一步一步来吧。总结的答案不一定都对,一定自己去使用VS实践一把,才能领会。 1、C++里面如何声明const void f(v

欢迎关注公众号:【码农突围】,回复9999,可以获取一份LeetCode刷题笔记 963

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

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

u012309611的专栏 606

谈谈 FOC和BLDC 电机控制

更具体地说,通过 “Park 变换”,我们可以把三相交流电流信号转换成两相直流电流信号,从而可以把三相交流电机的控制变得和两相直流电机控制一样简单。在内环 “电流环”中,一些比较重要的模块有 “Clark 变换” 和 “Park 变换” 等数学模块、电机电流信号检测模块以及能够提供电机的转速和转角位置信息的模块。日前,Qorvo 电机控制应用高级系统/应用工程师张绍发表了一个与 BLDC 和 FOC 相关的演讲,科普了 FOC 的相关知识,还讲解了 Qorvo 用于简化 FOC 实施方案的方法。

U_YAO的博客 2116

C++函数

C++函数 1.内联函数 使用内联函数必须采取下列叙述之一 1)在函数声明前加上关键字inline 2)在函数定义前加上关键字inline 通常做法是省略原型,将整个定义放在原型的位置,如果函数定义占用多行,使用内联函数就不太合适(由内联函数的使用方法决定)。 //定义内联函数 inline double square(double x) { return x * x; } 内联与宏: 内联函...

my_Benyy的博客 256

weblogic 集群搭建,双机部署,相关问题记录

4.5.集群搭建1 参考网址https://wenku.baidu.com/view/76365129cd1755270722192e453610661ed95aa4.html IP地址 端口 角色 192.168.1.160 9001 AdminServer ...

zl386119974的专栏 1669

怎样在c++中调用c语言的函数

很多小伙伴可能会在编程中遇到这样的问题,那就是在c++文件中调用c语言的函数会发生报错,那么为什么会出现这种情况,又该如何解决呢?例如:以上就是今天要讲的内容,本文仅仅简单介绍了如何在c++文件中调用c文件的函数,希望可以给大家带来帮助。...

weixin_59371851的博客 6071

Android 性能之 Game Mode

本文的目的是介绍 AOSP Game Mode 功能。Game Mode 功能的核心是系统服务 GameManagerService,在本文中用 GMS 指代 GameManagerService。在 API 26 之后,应用开发者可以通过将应用的 category 属性设置为 "game",使系统(即 GMS)能够将该应用识别为 "游戏"。GMS 定义了 4 种 game mode,即 1|2|3|4|standard|performance|battery|custom;

专注于系统快稳省领域 3053

【物联网技术】ESP8266 ESP-01/01s 固件下载烧录+STM32串口通信接线

ESP8266 ESP-01/01s 工作模式接线与MQTT固件下载烧录接线

嵌入式阿齐Archie 3万+

C/C++(3)C++调用C语言的函数和头文件

C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同,C++和C是两种完全不同的编译链接处理方式,如果直接在C++里面调用C函数,会找不到函数体,报链接错误,解决办法:加 extern “C”,示例如下: VS2015新建win32控制台应用程序,添加如下文件 c_include.h: #pragma once #include <stdio.h>int a

kღïξs√√ 4459

多模型机器学习生存预测分析:AUC比较、生存分层与SHAP解释

本文研究了多种机器学习模型在心力衰竭患者生存预测中的应用。通过比较逻辑回归、随机森林、XGBoost、LightGBM和梯度提升机五种模型的AUC表现,选择最优预测模型。基于最优模型的预测概率对患者进行风险分层,并使用Kaplan-Meier生存分析和log-rank检验验证分层的有效性。最后采用SHAP方法解释模型决策过程,识别关键预测因素。研究提供了从模型构建、评估到解释的完整技术流程,为临床预后预测提供了可复现的分析框架。

AI的内部世界的博客 157

c++中extern “C“的作用及理解

1 意图 extern "C"是C++特有的指令(C无法使用该指令),目的在于支持C++与C混合编程。 2 作用 extern “C”的作用是告诉C++编译器用C规则编译指定的代码(除函数重载外,extern “C”不影响C++其他特性)。 3 原因 为什么要用C规则编译C++代码呢? 因为C和C++的编译规则不一样,主要区别体现在编译期间生成函数符号的规则不一致。 C++比C出道晚,但是增加了很多优秀的功能,函数重载就是其中之一。由于C++需要支持重载,单纯的函数名无法区分出具体的函数,所以

米碎师兄 3万+

基于Simulink的永磁同步电机容错控制(缺相容错)

本文基于Simulink平台,详细介绍了永磁同步电机(PMSM)缺相容错控制的仿真实现方法。针对逆变器开路故障导致的缺相问题,提出"检测-重构-补偿"三阶段控制策略:采用电流阈值法快速检测故障(<5ms),重构αβ坐标系实现两相矢量控制,并通过谐波电流注入抑制转矩脉动(<8%)。仿真结果表明,该方法能有效维持故障后电机运行,转速波动<3%,满足电动汽车等关键应用的可靠性需求。文章包含完整的Simulink建模步骤、MATLAB函数代码及参数设置,为工程实践提供了可复现的

xiaoheshang_123的博客 146

朱长江《偏微分方程简明教程》答案第一章部分

偏微分方程简明教程第一章习题1.1 第一章 习题1.1 1、指出下列方程的阶,并判断它是线性的还是非线性的。如果是线性的,说明它还是其次的: (1)ut−(uxx+uyy)+1=0;(2)ut−uxx+xu=0;(3)ut−uxxt+uux=0;(4)ux2+uuy=0;(5)utt−uxx+t2+x2=0;(6)ux+eyuy=0;(7)ut+uxxxx+1+u=0;(8)ux(1+ux2)−12+uy(1+uy2)−12=0;(9)∂4u∂x4+2∂4u∂x2∂y2+∂4u∂y4=0;(10)∂3u∂x

ymengm的博客 6760

C++ extern “C”的作用详解

C++ extern “C”的作用详解1.示例2. 补充说明-C、C++编译器3. extern "C"使用要点 Reference: extern “C”的作用详解 extern "c" 的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上 extern “c” 后,会指示编译器这部分的代码按C语言,而不是C++的方式进行编译。 由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时

泠山的博客 1万+

Open3D 合并两个点云【2025最新版】

两个点云中的数据连接,博客长期更新,本文最新更新时间为:2025年4月26日。

点云侠的博客 7435

关于extern “C”

废话不多说,直接来看代码。 首先建了一个工程,主函数在cpp文件里,另外用c和c++语言各自实现了一个加法函数add。注意两个源文件的后缀,一个为“.c”,一个为“.cpp”。工程目录文件如下: 主函数如下: #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include "cfunction.h" #include "cplus...

不积跬步无以至千里 1万+

jre9下载 jdk9

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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【C++】extern “C“ 和 extern 深度探索

本文介绍了C和C++中extern关键字的用法及其在链接阶段的作用。extern用于声明在其他文件中定义的全局变量或函数,实现跨文件共享。extern "C"则是C++特有的用法,用于指示编译器按照C语言的链接规则处理代码,解决C++与C语言的链接兼容性问题,避免名称修饰带来的链接错误。文章还探讨了extern在修饰const变量时的注意事项,以及extern "C"影响本文件符号导出的细节。此外,还讨论了extern "C"对普通类型和C++类型符号导出的影响,以及extern "C"的正确使用方式。

杨翔裕的博客 2122

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

在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

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C++调用C函数,为什么要加extern “C“?链接器视角完全解析

写C++库时,如果可能被C调用,导出的接口都加extern "C"参数和返回值用C兼容类型内部实现随便用C++特性遇到undefined reference错误,检查是否是C/C++混用问题用nm工具查看符号表确认符号名是否匹配写头文件时,用条件编译保证C/C++兼容#endif// 声明#endif理解链接器的工作原理,很多"神秘"错误就不神秘了编译和链接是两个阶段链接器只看符号表。

2501_93283929的博客 818

cpp 程序调用 c 程序(extern “C“ 的使用)

.cpp 文件调用 .c 文件中的函数

challenglistic的博客 2933

在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

c++程序调用c函数(extern “C“的使用)

一、概念 c++程序调用c函数,即为在xx.cpp文件中调用在func.c文件中实现的函数 extern "C"的主要作用是为了实现c++代码能够调用c语言代码。加上extern "C"后,这部分代码编译器按c语言的方式进行编译和链接,而不是c++的方式。 二、原理 由于c++中需要支持函数重载,所以c和c++中对同一个函数经过编译后生成的函数名是不同的,这就会导致一个问题,如果在c++中调用一个使用c语言编写模块中的某个函数,c++是按照c++的名称修饰方式来查找并链接这个函数,就会发生链接错误。

大菜菜的博客 1万+

【21. extern “C“ , C和C++混合编译详解】

在实际的开发中,我们往往会遇到C和C++混合编译的场景。例如,使用C语言编写的库需要被C++程序调用,或者将C++代码与现有的C代码库集成。在这些情况下,C和C++之间的差异,尤其是函数的名称修饰(name mangling)和链接方式,会导致编译和链接错误。本文将详细介绍如何通过extern "C"解决这一问题,确保C和C++代码能够顺利互操作。C和C++语言在函数声明和链接的方式上存在差异,主要表现为C++的名称修饰机制。为了在C++中调用C语言的函数,必须使用extern "C"

涛ing的博客 1102
上一篇: 为什么strcpy的返回值是char* ?
下一篇: 我遇到的某个公司的笔试题目
ForNormandy
博客等级 码龄22年 7粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值