2012-05-01 48 views
0

下面的代码有问题:名称空间上的变量是否总是有默认值?

#ifndef _ALTERFPS_H 
#define _ALTERFPS_H 

#include "HUDLuaFunctions.h" 
#include "AlterFPSNodes.h" 

namespace AlterFPS 
{ 
    namespace Globals 
    { 
     static bool teamAwareness; 
     static int teams[] = {0, 0}; 

     static bool getAwareness() { 
      return teamAwareness;  
     } 

     static void setAwareness(bool aware) { 
      teamAwareness = aware; 
     } 
    } 
} 

#endif 

问题是teamAwareness始终是假的。 (我知道这不是Java),并发现setter的确将变量设置为true,但随后对getAwareness的调用显示teamAwareness为false (没有setAwareness之间的电话)...这怎么可能?我如何解决它?

+0

我无法重现您的错误。我从getter获得'true'或'false',这取决于我给定的setter。 – chrisaycock

+0

我在引擎中使用这段代码,我不太了解?有什么办法可以知道所说的引擎搞乱了我的代码吗?换句话说,当变量发生变化时,我该如何断点? teamAwareness的唯一引用是get和set,这正是我想要的。 – Machinarius

+0

@Drknezz:也许问题不在于上述代码,而在于您使用它的方式。代码对我来说看起来不错,chrisaycock似乎已经测试过它... – sergico

回答

3

静态生命期变量始终为零初始化。这些包括:

  • 命名空间变量(包括全局命名空间),无论它是否为静态。
  • 本地静态变量。
  • 成员静态变量。

零初始化,使其成为简单,是指:

  • 如果它是数字型的:0
  • 如果是布尔:假
  • 如果是指针:NULL
  • 如果它是枚举:0强制转换为枚举类型
  • 如果它是类类型:default构造。

但你的问题是不相关的是,那是因为你的变量声明static,它是在头文件,以便包括它实际上每个编译单元(.cpp文件)认为它的自己的实例变量。如果您从一个.cpp文件更改它,您将看不到另一个。

你想要做的是在.h文件中声明变量extern,然后通常把它定义(没有修改)在任何.cpp文件:

//.h file 
namespace Globals 
{ 
    extern bool teamAwareness; 

    inline void setAwareness(bool aware) { 
     teamAwareness = aware; 
    } 
} 

//.cpp file 
namespace Globals 
{ 
    bool teamAwareness; 
} 

BTW,功能更好的声明inline