c++ - 避免使用大量全局变量或使它们易于访问和修改的最佳方法

标签 c++ c++11

我正在翻译一个旧项目,该项目是在面向对象编程变得普遍之前编写的,并且那里有很多全局变量。这是一个用 Pascal 编写的项目,我尝试用现代 c++11 方式重写它,并尽可能实现最大可能的可移植性。

我的目的是使项目易于为其他人修改。我的问题是,由于这些变量没有正确声明,我现在在 Visual Studio 中遇到很多 LNK2019 错误。

问题是我有一些充满全局变量的头文件,比如

bool DS_Flag_0;
...
bool DS_Flag_11;

typedef unsigned short int UInt16;
//...

const UInt16 DayManth;
const UInt16 DayYear;
const UInt16 DayLongYear;
const UInt16 DayPer;

const int SecMin;
const double SecQuart; 
const double SecClock;
const double SecHalfDay; 
const double SecDay;
const double SecWeek;
const double SecYear;
const double SecPer;

而且我需要以某种方式在项目中几乎所有可能的文件中使用所有这些变量。 (是的,这是一个设计非常糟糕的项目,但我没有那么多时间从头开始重建它,所以..)

我看到了一些选项:

  1. 使用“extern”修饰符并创建大量“.cpp”初始化文件,因为我也需要初始化这些文件
  2. 以某种方式可以(可能)在“.h” header 中初始化所有这些。如果我想让项目对其他人可读,这是一个很好的编程习惯吗?
  3. 也许我可以通过某种方式在这里实现面向对象的模式来避免大量变量并使其更现代,可以吗?

该项目的目的是将大量卫星消息从二进制文件数据转换为另一种二进制格式,我首先需要让它与这些数据一起使用(但此信息并不是回答问题所必需的)。

更新: 更确切地说,我在命名空间为“Prm”和“Prm_BinDS”的文件中有很多变量。

我有文件“Prm_IDD_VAR.h”、“Prm_BinDS_MayUnit_Data.h”和“Prm_IDD_VAR.h”,它们都共享“Prm”命名空间。有“bool”类型的变量、“UInt16、float、double 和 unsigned char”类型的结构、单个无符号字符、 float 、double 甚至 std::string 和所有这些类型的数组。

namespace Prm {
bool GPS_FlagL1[33];
...
bool Gali_FlagL3[51];
//...
}

所有这些变量都必须在外部“.cpp”中初始化,我也想让它们有初始值。是否也可以在声明它们时以某种方式将它们初始化为全零? (我听说如果我使用 'static' - 除了声明它们的文件之外,我不能在任何地方使用我的全局变量)

最佳答案

大致上你需要这样做:

变量.h

// declare all global variables

extern int global1;
extern int global2;
extern int global3;
...

变量.cpp

// define all global variables

int global1;
int global2 = 123;   // initializing variable to something else than 0
int global3;

somefile.cpp

#include "variables.h"    
...
printd("Global1 = %d\n", global1);
...

someotherfile.cpp

#include "variables.h"    
...
global1 = foo;
...

关于c++ - 避免使用大量全局变量或使它们易于访问和修改的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47888722/

相关文章:

c++ - 从数组取值的 "procedure"有名字吗?

c++ - 继承抽象模板类

c++ - 观察者模式中的 Const-correct 通知程序

C++ std::vector<std::pair<const int, int>> 不能插入元素

c++ - std::regex 的编译时构建

c++ - 如何重载 operator new 和 delete 来跟踪内存?

c++ - 使用 C++ 和 Linux 的高分辨率计时器?

c++ - 构造函数、析构函数、重载=运算符函数、复制构造函数不会被继承。这究竟意味着什么?

C++开关枚举错误

c++ - 在 constexpr 变量模板中模拟 nan/inf