[英]Is it better to define global (extern) variables in a single header, or in their respective header files?
我正在做一个小型软件项目,希望以后以开源形式发布,所以我希望就当前关于该问题的最佳实践收集意见。
应用程序本身是过程性的, 而不是面向对象的(我不需要将呈现功能或事件处理功能封装在一个类中),但是应用程序的某些方面 是高度面向对象的(例如脚本控制台,它很大程度上依赖于OO)。 代码的OO方面具有标准的object.cpp
和object.h
文件。
对于过程部分,我将代码分成多个文件(例如main.cpp
, render.cpp
, events.cpp
),每个文件可能具有特定于该文件的全局变量。 我每个人都有对应的头文件,定义了我希望可以从其他文件访问的所有函数和变量(如extern
)。 然后,当我需要从另一个源文件访问该函数/变量时,我只是#include
正确的标题。
今天我意识到,我还可以有另一个选择:创建一个globals.h
头文件,在其中可以定义所有全局变量(再次为extern
)和特定源文件之外所需的函数。 然后,我可能只是#include
本文件中的所有的源文件(而不是每个单独的头文件就像我现在做的)。 另外,使用这种方法,如果我需要将变量/函数提升为全局变量(而不是局部变量),则可以将条目添加到头文件中。
问题 :是否为每个.cpp
文件使用相应的头文件(并在这些头文件中定义我希望全局访问的变量/函数),或者使用单个头文件声明所有全局可访问的变量/函数,是更好的做法? ?
另一个快速更新是使用大多数 (但不是全部 )全局变量,因为我的应用程序是多线程的。
对我来说,最好有一个与每个实现(c或cpp)文件相对应的头文件。 您必须将类,结构和函数视为模块,并且如果拆分实现,那么拆分声明也是合乎逻辑的。
另一件事是,当您修改头文件时,它会导致包含此文件的所有文件在构建时重新编译。 最后,我可以告诉您这可能需要很长时间。 您可以通过正确拆分声明来避免重建所有内容。
我建议增加标题,并减少标题数量。 您必须拥有包括在内的所有内容,但这很容易理解和编辑(如果错误)。
如果事情变得古怪,拥有一个大的全球公司将很难应对。 如果您确实必须更改某些内容,那么该更改可能会影响深远,而且风险很高。
在这种情况下,更多代码不是一件坏事。
一点要注意的是,由于每个文件都必须处理它,因此您在一个大的头文件中放入的代码越多,编译时间就会线性地超级增加。 在嵌入式项目中,可能不必担心,但是总的来说,头文件过多将使您不堪重负。
最好将它们全部放在一个文件中, 而不要完全编译该文件 。 如果您具有全局变量,则应该重新考虑设计,尤其是在进行应用程序编程而不是底层系统编程时。
正如我在问题下方的评论中所说的那样,首先要做的是尝试消除所有全局数据。 如果这不可能,而不是一个大的标题,或者将externs放入每个类的标题中,我将采用第三种方法。
假设您的Event
类需要有一个全局实例。 如果您在event.cpp
声明全局实例,并在event.hpp
中event.cpp
它,那么这实质上会使这些文件在其他任何地方都无法重用。 将其扔到globals.cpp
和globals.hpp
中也不理想,因为每次修改全局头文件时,都有可能重新构建整个项目,因为每个人都包含该头文件。
因此,第三个选择是为每个需要具有全局实例的类创建一个随附的头文件和源文件。 因此,您需要在event_g.cpp
声明Event
全局实例,并在event_g.hpp
中event_g.cpp
它。
是的,这很丑陋,是的,这很乏味。 但是,与全局数据无关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.