首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么要编译是否使用"extern"?

编译时使用"extern"关键字的目的是为了在多个源文件之间共享变量或函数的定义。当一个变量或函数在一个源文件中被声明为"extern"时,它的定义可以在其他源文件中进行,从而实现了跨文件的共享。

使用"extern"的主要原因有以下几点:

  1. 分离接口和实现:通过将变量或函数的声明放在头文件中,并在源文件中使用"extern"关键字进行引用,可以将接口和实现分离开来。这样做的好处是,当需要修改实现时,只需修改实现文件,而不需要修改引用该变量或函数的其他文件。
  2. 避免重复定义:当多个源文件中都需要使用同一个全局变量或函数时,如果不使用"extern"关键字,每个源文件都会有自己的定义,导致重复定义的错误。使用"extern"可以将变量或函数的定义放在一个源文件中,而在其他源文件中使用"extern"进行引用,避免了重复定义的问题。
  3. 提高编译速度:当一个源文件中使用了"extern"关键字引用另一个源文件中的变量或函数时,编译器在编译时不会对被引用的源文件进行重新编译,而是直接使用已经编译好的目标代码。这样可以节省编译时间,提高编译速度。
  4. 支持模块化开发:使用"extern"关键字可以将程序分割成多个模块,每个模块负责不同的功能。这样可以提高代码的可维护性和可重用性,方便团队协作开发。

总结起来,使用"extern"关键字可以实现变量和函数的跨文件共享,分离接口和实现,避免重复定义,提高编译速度,支持模块化开发。在实际应用中,可以根据具体需求和项目结构来决定是否使用"extern"关键字。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【面试宝典】c调用c++函数,为什么extern c

首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。...这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数 extern "C"是连接申明(linkage declaration...),被extern "C"修饰的变量和函数是按照C语言方式编译和连接的,来看看C++中对C的函数是怎样编译的: 作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。...加extern "C"声明后的编译和连接方式 加extern "C"声明后,模块A的头文件变为: // 模块A头文件 moduleA.h #ifndef MODULE_A_H #define MODULE_A_H...我们在思考问题时,不能只停留在这个语言是怎么做的,还要问一问它为什么这么做,动机是什么,这样我们可以更深入地理解许多问题):实现C++与C及其它语言的混合编程。  ----

1.8K140

杂谈-为什么编译技术

对于C#、VB等高级语言而言,此时编译器完成的功能是把源码(SourceCode)编译成通用中间语言(MSIL/CIL)的字节码(ByteCode)。...以及各大书本上写的“将计算机语言翻译成计算机能识别的语言”,栏主这几个星期消失的时间段里,从编译原理基础开始,到理解正则,文法,优化,错误处理等各个方面为各位理清,编译究竟做了什么,我们的终极目标是成功编译方舟编译器...主函数入口 main 函数printf 打印hello world 然后生成抽象语法树: 3f53e82a3b2714f99d97f0e66d01c7fb.jpg 第三个步骤:语义分析 分析上诉AST是否通达情理...N取决于高级语言有多少种关键字比如 c语言: void printf int float go语言: go for := 那么上述AST树就会变成数字+字符+字母的中间状态组合 二·为什么你需要学习编译技术...顺便一提栏主编译+逆向同步进行。年后更新

81300

前端工程师为什么学习编译原理?

为了更好地理解编译器前端的工作原理,本文将主要以目前被广泛使用的 Babel 为例,阐述它是如何将源代码编译为目标代码。...它所使用的 Babylon 实现了编译器中两个部分,词法分析和语法分析。...举个例子,匹配一个 Number 类型的 Token,可以检测是否以 [0-9] 开头,接着循环或递归扫描紧连的后续字符,且需要特别留意 0b、0o、0x 开头的非十进制数值、科学计数法 e 或 E、...生成代码 工业级别的语言编译器,通常还会有语义分析阶段,检查程序上下文是否和语言所定义的语义一致,比如类型检查,作用域检查,另一个则是生成中间代码,比如三地址代码,用地址和指令来线性描述程序。...当然一个好的模板引擎还会考虑功能、性能与安全兼备,上面的with语句是避免的,还要引入缓存机制,XSS 防范机制,以及更加强大、友好、易于使用的语法糖。

1.5K31

unity程序使用云渲染技术是否修改?

在和客户沟通的过程中,点量小芹发现很多客户对于使用实时云渲染技术后,程序可以在手机或者平板中使用是否需要对程序进行修改以适配在手机中使用?...unity.png 解答这个问题,先要知道云渲染的技术原理是什么。...云渲染的本质是将本来需要安装在本地电脑上,才可以使用的程序放在服务器上,而用户通过浏览器打开服务器上的程序即可使用,而且效果和本地使用几乎一样,即将本来C/S架构的内容改为了B/S架构。...这种方式有很多好处,对用户来说使用方便,不需要因为设备性能更不上而不能使用,而且操作也简单了不需要在安装程序。...而unity引擎开发的程序使用了点量云渲染系统后,为啥不用对程序修改就可以实现手机和平板中直接使用呢?

1.1K20

为什么推荐你使用Core WebApi?

作为分布式实施的基础,跨进程通信的技术也是五花八门,为什么Core WebApi越来越火,被众多大牛们一直推荐?小编这就为你一一解答!...02 基于Http协议的服务 如WebService、WCF、WebApi,甚至还有ashx一般处理程序,使用最广泛。...03 远程调用模式 远程调用模式,包括FX下的RPC和.NetCore下的gRPC,有使用限制和优异的性能。大部分的开发者和项目选型中,第二类是最为广泛的。下文对gRPC和WebApi有细致比对。...更好的REST风格支持(WCF也可以但很麻烦),对移动端的友好支持等,甚至跟MVC同一个开发技术栈,这些理由很充分的让技术团队都倾向于使用WebApi。...,REST的通用性更强,像典型的前后端分离架构,当下各公众平台对外数据提供,都是选择的REST接口,包括在微服务架构实施上,Core WebApi使用还是更广泛一些。

1.2K20

为什么谨慎使用Arrays.asList、subList?

使用Arrays.asList的注意事项 1.1 可能会踩的坑 先来看下Arrays.asList的使用: List statusList = Arrays.asList(1, 2)...返回的是ArrayList,很熟悉,有木有,但是再细心一看,就会发现此ArrayList并不是我们经常使用的ArrayList,因为我们平时经常使用的ArrayList是位于java.util包下的:...关于这一点,在《阿里巴巴Java开发手册》泰山版中,也有提及: 使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的 add/remove/clear 方法会抛出...所以大家在使用Arrays.asList时还是要注意下,避免踩坑。 1.3 总结 Arrays.asList方法可以在一些简单的场合使用,比如快速声明一个集合,判断某个值是否在允许的范围内: ?...使用ArrayList的subList的注意事项 先来看下subList的简单使用: List bookList = new ArrayList(); bookList.add("遥远的救世主

74021

为什么推荐大家使用Spring Cloud Alibaba

当然我这里要说的就是Spring Cloud Alibaba,为什么推荐大家去使用呢?...首先,Spring Cloud Alibaba并不是一款纯碎的RPC框架,它是一款微服务治理框架,也就是说无论是你想自研微服务框架还是直接使用开源的微服务框架,那么使用Spring Cloud Alibaba...我相信现在很多企业都有上上云的需求,也就是将自己的业务服务托管到云上,比如阿里云。...这个中兼容确实很重要,假如你的业务服务已经在使用旧的RPC框架,并且已经使用很多年了,这个时候你去升级技术,你不可能在第一阶段就将所有的业务服务改造完成,再整体上线,这个不太现实。...框架升级,也不影响改造的框架的同步升级。

80940

对象不再使用时,为什么赋值为 null ?

鉴于网上有太多关于此问题的误导,本文将通过实例,深入JVM剖析“对象不再使用时赋值为null”这一操作存在的意义,供君参考。本文尽量不使用专业术语,但仍需要你对JVM有一些概念。...等等,为什么例子里placeHolder不赋值为null,GC就“发现不了”placeHolder该回收呢?这才是问题的关键所在。...运行时栈 典型的运行时栈 如果你了解过编译原理,或者程序执行的底层机制,你会知道方法在执行的时候,方法里的变量(局部变量)都是分配在栈上的;当然,对于Java来说,new出来的对象是在堆中,但栈中也会有这个对象的指针...而且局部变量表在编译时即已确定,不需要等到“运行时”。 GC一瞥 这里来简单讲讲主流GC里非常简单的一小块:如何确定对象可以被回收。另一种表达是,如何确定对象是存活的。...现在算是理清了“不使用的对象应手动赋值为null“的原理了,一切根源都是来自于JVM的一个“bug”:代码离开变量作用域时,并不会自动切断其与堆的联系。为什么这个“bug”一直存在?

50220

前端-为什么立刻放弃 React 而使用 Vue?

我会在这篇文章里说明我对 Vue 流行的一些看法,以及为什么它能超过竞争者。...由于 Vue 的设计哲学和特性与 React 十分相似,我会比较这两者,并说明为什么 React(即使它是个好框架)经常很有欺骗性。...不论是你改变技术栈的其他部分,还是需要在紧急状况下向团队里增加更多人,或者解释你的产品,Vue 都能节约你的时间,从而节约金钱。...考虑到在大型项目中使用这些框架,使用 React 时你需要掌握其他库,并教给你的团队怎样使用。还要处理各种相关的问题(甲不喜欢这个库,乙不理解那个库等)。Vue 栈更简单,更适合团队使用。...为什么还要应付这些麻烦呢?就为了社区和第三方库?为了获得一小部分好处,我们承受太多痛苦,而就连这一小部分好处,也越来越变得不重要。 React 曾经让我的生活更容易,但在某些方面又让实现变得更复杂。

1.1K40

Java : 对象不再使用时,为什么赋值为 null ?

鉴于网上有太多关于此问题的误导,本文将通过实例,深入JVM剖析“对象不再使用时赋值为null”这一操作存在的意义,供君参考。本文尽量不使用专业术语,但仍需要你对JVM有一些概念。...等等,为什么例子里placeHolder不赋值为null,GC就“发现不了”placeHolder该回收呢?这才是问题的关键所在。...运行时栈 典型的运行时栈 如果你了解过编译原理,或者程序执行的底层机制,你会知道方法在执行的时候,方法里的变量(局部变量)都是分配在栈上的;当然,对于Java来说,new出来的对象是在堆中,但栈中也会有这个对象的指针...而且局部变量表在编译时即已确定,不需要等到“运行时”。 GC一瞥 这里来简单讲讲主流GC里非常简单的一小块:如何确定对象可以被回收。另一种表达是,如何确定对象是存活的。...现在算是理清了“不使用的对象应手动赋值为null“的原理了,一切根源都是来自于JVM的一个“bug”:代码离开变量作用域时,并不会自动切断其与堆的联系。为什么这个“bug”一直存在?

1.2K10

Java对象不再使用时,为什么赋值为null?

在Java这门广泛使用的编程语言中,内存管理一直是开发者必须关注的重要议题。特别是在处理对象时,正确地管理内存不仅关系到程序的性能,还涉及到程序运行时的稳定性。...本文将深入探讨为什么在Java中,当对象不再被使用时,赋值为null是一个被推荐的做法。1. Java内存管理简介在讨论null赋值之前,我们先简要了解一下Java如何管理内存。...4.3 使用后立即失效的对象:对于只在短时间内使用并且之后立即失效的对象,赋值为null可能也是多余的。5....5.2 使用弱引用:在合适的场景使用弱引用(WeakReference),它们允许垃圾回收器更加自由地回收对象。5.3 优化数据结构:对于存储大量对象的数据结构,要注意及时清理不再需要的对象。...理解何时以及为什么使用null赋值,以及遵循良好的内存管理实践,对于编写高效且可维护的Java程序至关重要。通过这些方法,开发者可以更好地管理和优化他们的应用程序的内存使用,确保高效稳定的运行。

12910

Swift: 为什么避免在结构体中使用闭包?

好吧,如果这使我们工作变得容易,那为什么避免在Swift结构中使用闭包呢? 原因是:内存泄漏和意外行为。 结构内存泄漏,可能吗? 结构是值类型,并且不可能发生内存泄漏。那句话是真的吗?...结构体中产生循环引用的罪魁祸首——闭包(Closures) 当您在结构中使用闭包时,闭包的行为就像一个引用类型,问题就从那里开始。闭包需要引用外部环境,以便在执行闭包主体时可以修改外部变量。...在使用类(Class)的情况下,我们可以使用[weak self]打破循环引用。...当我们尝试对某个结构执行此操作时,会出现以下编译器错误,'weak' may only be applied to class and class-bound protocol types, not '...这就是为什么Swift结构中的闭包很危险的原因。 直接的解决方案是,避免在值类型中使用闭包。如果要使用它们,则应格外小心,否则可能会导致意外结果。

1.7K20
领券