深入剖析C++为啥有extern

C/C++编程中extern与extern “C“的深度解析与工程实践 在C/C++多文件编程与混合语言开发中,理解符号的声明、定义与链接过程是解决复杂工程问题的关键基础。编译器在编译阶段处理单个源文件,而链接器则负责将多个目标文件中的符号引用与定义关联起来,生成最终可执行程序。这一机制的核心价值在于实现代码的模块化、复用与跨语言协作,广泛应用于大型项目构建、第三方库集成以及系统级软件开发等场景。其中,extern关键字用于声明外部链接的变量或函数,解决多文件间的全局符号共享问题;而extern "C"链接规范则专门处理C与C++编译器间因名字修饰规则差异导致的符号匹配难题,是 阅读详情

大家都知道C++中有个extern关键字是用来识别C语言的,然后以C语言的形式去编译。
原因:C++里面出现了函数重载这东西,导致和C中编译函数,生成的符号不一样,所以引入了extern。
估计大家也都知道原因,但是你有尝试去看过那些符号么?

—– now 带大家去 look look —–

先创建一个test.cpp文件

void func(){}
void func(int a){}
int func(int a,int b)
{
        return 1;
}

extern "C"
{
    void func2(){}
}

int main(){}

然后编译它,不要链接它
$ g++ test.cpp -c

$ objdump -t test.o

这里写图片描述

上面已经把程序中所有函数的符号表展现出来了

void func(){}               对应 _Z4funcv
void func(int a){}          对应 _Z4funci
int func(int a,int b)       对应 _Z4funcii
void func2(){}              对应func2

上面v表示空,i表示整形
现在清楚了吧为啥C++有个extern

ethercat linux lan9252 - lan9253调试 linux 的ethercat测试 阅读详情

相关推荐

QCustomPlot实现毫秒级时间轴数据的动态可视化与实时刷新优化

本文深入探讨了如何利用QCustomPlot库高效实现毫秒级时间轴数据的动态可视化与实时刷新。文章从基础配置讲起,详细介绍了时间轴初始化、数据平滑滚动、增量更新与内存管理等核心优化技巧,并分享了应对高频数据的缓冲策略及OpenGL硬件加速等高级优化手段,旨在解决实时图表卡顿问题,提升流畅度。

weixin_29012677的博客 424

随笔--C++/C语言知识--为什么要用“extern C”

  -------     点击转到转载来源  --------   想一想,如果C++程序要调用一个已经编译好的C程函数时,该怎么操作呢?   如果有一个C函数的声明是这样的: void foo(int x, bool y) 该函数在C编译器编译后在库中的名字为 "__foo"; 该函数在C++编译器编译后在库中的名字为"__foo_int_bool" ,之所以C++编译器这样操...

Johnisjohn的博客 498

Unity物理引擎实战:从刚体重心到碰撞体,打造真实不倒翁交互

刚体(Rigidbody)是Unity物理系统的核心组件,它定义了游戏对象的物理属性,如质量、阻力和碰撞响应。其原理基于牛顿力学,通过物理引擎(如PhysX)实时计算物体的运动状态。在游戏开发中,刚体的价值在于能够模拟真实世界的物理行为,为玩家提供沉浸式的交互体验。碰撞体(Collider)则定义了物体的形状边界,用于检测与其他物体的接触。通过精细调整刚体的重心(Center of Mass)和碰撞体形状,开发者可以模拟出各种有趣的物理现象,例如低重心物体的动态平衡。这在休闲游戏、物理玩具模拟等场景中尤为实

weixin_33976326的博客 354

简述extern的作用,说明什么时候会使用extern?

extern可以置于变量或者函数前,以表示这个变量或函数定义在别的文件中,提示编译器在遇到此变量或函数的时候在其他模块寻找其定义。 主要使用方式有两种: 1.如果函数的声明中带有extern,说明这个函数定义在其他文件中,这样的好处是可以取代include”*.h”,在一些复杂的项目中这样使用比较方便 2.C++在变异的时候为了解决函数的多态问题,会将函数名和参数联合起来生成

奋斗吧 自己的路跪着也得走 3933

Xilinx FPGA平台GTX简易使用教程(四)GTX IP核配置教程

干货来了,GTX IP核配置,搬砖全靠它~~

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

C++中引用编译过的C代码为什么要用"extern c"

C++中引用编译过的C代码为什么要用"extern c" 函数经过编译系统的翻译成汇编,函数名对应着汇编标号。 因为C编译函数名与得到的汇编代号基本一样,如:fun()=>_fun, main=>_main 但是C++中函数名与得到的汇编代号有比较大的差别。 如:由于函数重载,函数名一样,但汇编代号绝对不能一样。 为了区分,编译器会把函数名和参数类型合

gangyanliang的专栏 3483

手把手教你学simulink(26.7)--控制算法场景示例:基于模型预测控制(MPC)的智能温室环境控制系统

首先,我们需要将温室环境的动力学模型转换为状态空间形式。假设我们有四个状态变量:温度 TT、湿度 HH、光照强度 II 和二氧化碳浓度 CCO2CCO2​,以及四个控制输入:加热器功率 u1u1​、加湿器加湿量 u2u2​、通风扇风速 u3u3​ 和补光灯光照强度 u4u4​。状态空间模型可以表示为:x(t)=[T(t),H(t),I(t),CCO2(t)]Tx(t)=[T(t),H(t),I(t),CCO2​(t)]T 是状态向量。

MHD0815的博客 400

为什么C++用C函数时要加extern c

C++相对于C语言而言支持函数重载是其极大的一个特点,相信在使用C语言的时候大家如果要写一个实现两个整型数据相加的函数还要写一个浮点型数据相加的函数,那么这两个函数的名字绝对不可以一样,这样无疑在我们使用这个函数的时候增加了复杂性,但是在C++中我们却可以很好的解决这个问题,因为在C++中函数是支持重载的也就是说两个函数的函数名可以一样,这样并不会出现函数名重定义的问题,但是我们在...

Quellaaa的博客 910

PCL点云库入门(第1讲)——PCL库简介和安装(Win10/11+VS2019+PCL 1.12.0)

PCL,全称为,即点云库,是一个专注于2D/3D图像和点云处理的大型开源项目。该项目最初由斯坦福大学的杰出计算机视觉专家Radu博士及其团队开发和维护,经过十余年的发展,目前(2024年12月)已更新至1.14.1版本。PCL点云库集成了众多尖端的点云处理算法,这些算法不仅包括基础的滤波、特征估计、表面重建、配准、模型拟合和分割等,还涵盖了更高级的功能,如点云数据的语义理解、场景解析以及动态环境下的实时处理。这些算法能够对含有噪声的点云数据进行有效过滤,去除异常值;

qq_36812406的博客 1万+

使用Android Studio调试系统应用之TvSettings(一):移植

对于做ROM的同仁、以及想要深入学习Android同学,必定会去调试Android的系统APK,而 *aosp* 源码中的系统APK源码,无法直接在Android Studio中进行调试,本文将持续更新细节,手把手教你,使用Android Studio调试安卓的系统应用。在每个阶段,提供知识点的梳理、总结,为您答疑解惑!

上周的博客 2054

c++ extern的用处(转载)

转自chao_yu,cnblog.com1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。      也就是说extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数...

pursue_my_life的博客 612

RFC 字符码转换深度解析:Unicode、非 Unicode 与 MDMP 系统的协奏

老版本 MDMP 系统不上传自定义映射时,Unicode 端会落回“预配置列表”。列表里可见西欧 1100、日文 8000、中文 8400 等经典编号。若需强制覆写映射,可在 SM59 ➡Unicode页签启用,或直接勾选作为兜底。字符编码问题常“潜伏”多年,一旦旧系统升级或新增语种便集中爆发。掌握 RFC code page 转换机理、灵活运用 SM59 选项、在早期对 LANG 字段和字段长度进行治理,是根治乱码与 short dump 的关键。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 222

C/C++ extern 与 static 对比:5种存储类作用域与链接性深度剖析

本文深入剖析了C/C++中extern与static关键字的存储类作用域与链接性差异,通过5种典型场景对比和代码示例,帮助开发者掌握变量生命周期、作用域控制及多文件协作的正确用法。重点解析extern的跨文件共享机制与static的文件内封装特性,并提供工程实践建议以避免常见陷阱。

weixin_34034670的博客 433

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

NTscan扫描工具

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

c++ builder6.0 里对象的代码_详细剖析 extern "C"

来源:JustDoIThttps://www.cnblogs.com/TenosDoIt/p/3163621.html【导读】:本文详细解析extern "C"的底层原理与实际应用。以下是正文在你工作过的系统里,不知能否看到类似下面的代码。这好像没有什么问题,你应该还会想:“嗯⋯是啊,我们的代码都是这样写的,从来没有因此碰到过什么麻烦啊~”。你说的没错,如果你的头文件从来没有被任何C++...

weixin_31995343的博客 382

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C/C++互操作关键技巧(extern “C“深度剖析)

掌握C/C++互操作关键技巧,深入解析C 语言与 C++ 的 extern "C" 兼容机制。涵盖函数声明、链接规范与跨语言调用场景,避免命名混淆,提升代码复用性。实用方法总结,值得收藏。

PixelIsle的博客 1073

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

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

嵌入式的C/C++:深入理解 inline 、extern与 extern “C“的用法与特点

在嵌入式开发中,C 和 C++ 是最常用的编程语言,特别是在高性能和低资源的硬件环境中,合理使用语言特性显得尤为重要。inline、extern 和 extern "C" 是嵌入式开发中的三大关键关键词,它们直接影响代码的性能、模块化设计以及跨语言的互操作性。然而,很多开发者对这些关键词的作用、使用场景以及注意事项了解不够全面,甚至可能在实际项目中导致难以察觉的错误。本文将从嵌入式开发的视角,深入剖析 inline、extern 和 extern "C" 的用法与特点,帮助您在项目中灵活运用,编写更高效、更

wallwayj的博客 1644

头文件源文件间的关系(ifndef,extern)

头文件与源文件的分工以及头文件重复包含

y54188q的博客 346

C\C++中的链接类问题整理

在C\C++的代码的初学阶段,常常会出现"XXX重定义"、”,或“XXX未定义”等问题,尤其是在初次接触比较复杂的代码的时候,各种文件关系复杂,在编译时猛然蹦出这么一个问题,乍一看让人有点摸不着头脑。为了详细介绍这个问题,下面将引用一个简单的来展示这种bug的出现,并给出相应的解决办法。 以C++为例,假设有两个功能A.cpp\B.cpp,以下为A.cpp对于的.h文件(只做演示) clas...

曦酱的思维工厂 263

关于对extern的理解

该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。(2)在C中引用C++语言中的函数和变量时,C++的头文件需添加extern "C",但是在C语言中不能直接引用声明了extern "C"的该头文件,应该仅将C文件中将C++中定义的extern "C"函数声明为extern类型。仅仅是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间。

weixin_41664523的博客 745

模板编程—C++不支持模板分离编译分析

摘要:C++模板编译具有特殊性,不同于普通代码的编译过程。由于模板采用延迟加载机制,只有在实例化时才会生成具体代码,这导致模板不支持分离编译(声明在头文件而实现在cpp文件)。实验表明,当模板函数未被调用时不会生成对应代码,从而引发链接错误。因此模板代码通常需要完整定义在头文件中,以确保编译器在需要时能正确实例化模板。这种特性也解释了为何模板相关问题常在链接阶段显现。

fpcc的专栏 978

C语言面试篇:extern关键字

答案extern声明仅告诉编译器变量的类型和名称,表明变量在其他文件中定义,不分配内存;定义变量(如int a = 10;)会分配内存并初始化。若extern声明时赋值(),编译器会将其视为定义,多文件中重复定义会引发 “多重定义” 错误。extern。

2503_90903957的博客 1185

【C++】一篇文章深入理解extern与inline关键字

本文深入解析C++中的extern与inline关键字。extern用于控制变量/函数的链接属性,实现跨文件访问和兼容C语言;inline则用于函数内联优化和头文件定义。extern声明符号但不分配内存,而inline允许函数/变量在头文件中定义而不引发多重定义错误。二者在多文件编程中常协同使用:extern共享全局符号,inline提供高效工具函数。掌握这两个关键字能有效解决"未定义引用"和"多重定义"问题,优化代码结构和性能。

2402_88083295的博客 1390

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

1.引言  C++语言的创建初衷是“a betterC”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C

michael_k的专栏 851

【C\C++】extern关键字在 C/C++ 中的深入解析

本文深入解析C/C++中的extern关键字,揭示其管理程序链接性和可见性的核心作用。extern主要实现三大功能:声明外部链接性以共享跨文件变量/函数,解决全局标识的可见性问题,以及通过extern "C"实现C++与C的兼容交互。文章详细剖析了变量声明中的extern用法(包括常量特例)、函数声明场景,并通过代码示例和图表对比说明其应用。同时指出C++17引入的inline变量作为现代替代方案。掌握extern的正确使用是提升代码组织性、可维护性和跨平台能力的关键技能。

王牌飞行员_里海的博客 1478

C++模板分文件编写实践:从编译原理到工程化策略

C++模板是泛型编程的核心机制,其编译模型基于两阶段查找和按需实例化原理。与普通函数不同,模板的定义必须在实例化点对编译器可见,这决定了传统的头文件声明与源文件定义分离方式会引发链接错误。理解这一原理对优化代码组织、提升编译效率和维护性至关重要。在工程实践中,常见的解决方案包括将模板全部置于头文件、使用显式实例化控制类型、或采用.hpp与.ipp分离的逻辑组织方式。针对大型项目,还可结合C++11的extern template声明来抑制重复实例化,从而平衡编译速度与代码结构。这些策略围绕c++函数模板和头

weixin_33853794的博客 436
上一篇: epoll读到一半又有新事件来了怎么办?
下一篇: scrapy爬虫【1】→学习路上的坑和大家一起分享
帅东
博客等级 码龄11年 676粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值