在单个标头或其各自的头文件中定义全局(外部)变量是否更好?

时间:2011-08-26 15:30:58

标签: c++ c coding-style

我正在开发一个小软件项目,我希望将来作为开源软件发布,所以我希望收集有关此问题目前最佳接受做法的意见。

应用程序本身是程序性的,不是面向对象(我不需要在类中封装渲染函数或事件处理函数),但某些方面应用程序 严重面向对象(如脚本控制台,它严重依赖于OO)。代码的OO方面具有标准object.cppobject.h文件。

对于程序部分,我将我的代码拆分为各种文件(例如main.cpprender.cppevents.cpp),每个文件可能包含一些特定于该文件的全局变量。我也有相应的头文件,定义了我想要从其他文件访问的所有函数和变量(如extern)。然后,当我需要从另一个源文件访问该函数/变量时,我只是#include正确的标题。

我今天意识到我还可以有另一个选择:创建一个globals.h头文件,我可以在其中定义所有全局变量(再次为extern)和在外部需要的函数具体的源文件。然后,我可以在所有源文件中#include这个文件(而不是像我现在那样使用每个单独的头文件)。另外,使用这种方法,如果我需要将变量/函数提升为全局(而不是本地),我可以将条目添加到头文件中。


问题:对每个.cpp文件使用相应的头文件是一种更好的做法(并定义我想要的全局变量/函数)可以在这些头文件中访问,或者使用单个头文件来声明所有可全局访问的变量/函数?


另一个快速更新,大多数(但并非所有)全局变量都是这样使用的,因为我的应用程序是多线程的。

4 个答案:

答案 0 :(得分:3)

对我而言,拥有与每个实现(c或cpp)文件相对应的头文件会更好。您必须将您的类,结构和功能视为模块,如果您将实现分开,那么您也可以分割您的delarations。

另一件事是,当您修改头文件时,它会导致包含它的所有文件在构建时重新编译。最后,我可以告诉你它可能需要很长时间。您可以通过正确拆分声明来避免重建所有内容。

答案 1 :(得分:2)

我建议有更多的标题,并减少它们。你必须拥有一连串的包含,但如果错误的话,这很容易理解和编辑。

如果事情变得古怪,拥有一个大的全局变量就更难应付。如果你确实需要改变一些东西,那么这种变化可能会影响深远,风险很大。

在这种情况下,更多代码并不是坏事。

一个小问题是,由于每个文件都必须处理它,因此编译时间会越大越线性地增加,因为你放入一个大标题。在一个嵌入式项目中,它可能不那么令人担心,但通常在标题中有很多会开始让你失望。

答案 2 :(得分:1)

最好将它们全部放在一个文件中,而不是完全编译该文件。如果你有全局变量,你应该重新考虑你的设计,特别是如果你正在进行应用程序编程而不是低级系统编程。

答案 3 :(得分:0)

正如我在下面的评论中所说,首先要做的是尝试消除所有全球数据。如果这是不可能的,而不是一个大标题,或者在每个类的标题中抛出外部,我会采用第三种方法。

假设您的Event类需要拥有全局实例。如果您在event.cpp中声明全局实例并在event.hpp中将其外部化,那么这实际上使这些文件在其他任何地方都不可重用。把它扔进globals.cppglobals.hpp并不理想,因为每次修改全局标题时,很可能会重建整个项目,因为每个人都会包含标题。

所以第三个选项是为每个需要拥有全局实例的类创建一个附带的头文件和源文件。因此,您要在Event中声明event_g.cpp全局实例,并在event_g.hpp中将其展开。

是的,它很难看,是的,这很乏味。但是全球数据并没有什么相关的。