避免使用大量全局变量或使其易于访问和修改的最佳方法

Iva*_*kin 1 c++ c++11

我正在翻译一个旧项目,在面向对象编程之前编写成为常见的东西,我有很多全局变量.这是一个用Pascal编写的项目,我尝试用现代的c ++ 11方式重写它,并尝试尽可能地实现最大的可移植性.

我的目的是让项目易于为其他人修改.我的问题是我现在在Visual Studio中得到了很多LNK2019错误,因为这些变量没有很好地声明.

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

bool DS_Flag_0;
...
bool DS_Flag_11;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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

我看到了一些选项:

  1. 使用"extern"修饰符并创建大量".cpp"初始化文件,因为我还需要初始化它们
  2. 以某种方式使(可能)在".h"标题内初始化它们成为可能.如果我想让项目对其他人可读,那么这是一个很好的编程实践吗?
  3. 也许我可以在某种程度上实现面向对象的模式,以避免很多变量并使其更现代化,是吗?

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

更新:更确切地说,我在名称空间为"Prm"和"Prm_BinDS"的文件中有很多变量.

我有文件"Prm_IDD_VAR.h","Prm_BinDS_MayUnit_Data.h"和"Prm_IDD_VAR.h",它们都共享"Prm"命名空间.存在类型为"bool"的变量,具有"UInt16,float,double和unsigned char"类型的结构,单个无符号字符,浮点数,双精度甚至std :: string和所有这些类型的数组.

namespace Prm {
bool GPS_FlagL1[33];
...
bool Gali_FlagL3[51];
//...
}
Run Code Online (Sandbox Code Playgroud)

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

Jab*_*cky 6

大概你需要这样做:

variables.h

// declare all global variables

extern int global1;
extern int global2;
extern int global3;
...
Run Code Online (Sandbox Code Playgroud)

variables.cpp

// define all global variables

int global1;
int global2 = 123;   // initializing variable to something else than 0
int global3;
Run Code Online (Sandbox Code Playgroud)

somefile.cpp

#include "variables.h"    
...
printd("Global1 = %d\n", global1);
...
Run Code Online (Sandbox Code Playgroud)

someotherfile.cpp

#include "variables.h"    
...
global1 = foo;
...
Run Code Online (Sandbox Code Playgroud)