EXTERN或STATIC用于维护许多变量

时间:2014-07-30 05:00:33

标签: c++ memory-management scope

在2011年7月28日11:56阅读“ruhalde”评论后, extern keyword usage

我想了解如何组织许多变量,使用EXTERN与STATIC。

在那篇文章中, 1)定义器和初始化器位于CPP文件中。 2)使用“extern”声明,但没有定义,在单独的.h文件中。

假设我在MULTIPLE CPP文件中有100个全局变量(但在某种程度上相关),将它们全部归为一个.h文件是分享它们的好方法。

但这需要开发人员在MULTIPLE CPP和头文件中维护(这些相关的)变量。我见过其他开发人员使用“static”将所有变量分组到一个.h文件中。

e.g。 myheader.h

static int var1 = 1;
static int var2 = 2;
...

这更容易维护。但据我了解,这些变量不再是“全球性的”。 “static”关键字将范围缩小到包含此头文件的cpp文件。

foo1.cpp

#include "myheader.h"
void foo1()
{
  var1 +=1;
  var2 +=2;
  printf(....., var1, var2);
}

foo2.cpp

#include "myheader.h"
void foo2()
{
  var1 +=100;
  var2 +=200;
  printf(....., var1, var2);
}

var1,foo1中的var2是var1中的DIFFERENT变量,foo2中是var2。  更严重的是,myheader.h中的每个变量都会为包含它的每个函数重新创建。

问题:(假设我正确使用“extern”和“static”)

通过不使用“extern”来创建真正的全局变量,使用“静态”来更容易地进行代码维护是一种可接受的替代方案吗?

3 个答案:

答案 0 :(得分:1)

  

假设我在MULTIPLE CPP文件中有100个全局变量(但以某种方式相关),

是一个非常糟糕的设计!根本就不要这样做!

  

通过不使用“extern”来创建真正的全局变量,使用“静态”来更容易地进行代码维护是一种可接受的替代方案吗?

这完全是另一回事!正如您所写,static每次在cpp文件中使用它时都会为您提供新的实例。静态没有全球性的东西!

我建议你

  1. 不要使用全局变量
  2. 如果您使用全局变量,请将它们放在手工完整的类中以使其更易于处理
  3. 请记住,vars / class实例的初始化将取决于链接顺序。永远不要依赖那个订单!
  4. 查看singleton pattern

答案 1 :(得分:0)

您可以将所有变量放在标题中,将它们声明为extern。现在在cpp中定义它们。 然后,您可以将标题包含在需要这些变量的源文件中。

答案 2 :(得分:0)

我会将static个变量放在.h文件中,只有它们是常量。这样,包含.h文件的每个文件都将获得相同的,未更改的值。

正如您所解释的那样,用户(以及开发人员在调试时)看到变量在不同函数中具有不同的值会非常混乱。

对于不是const的变量,我建议将它们声明为extern个变量。它们可以在适当的.cpp文件中定义。