命名空间上的变量是否始终具有默认值?

时间:2012-05-01 19:59:35

标签: c++ namespaces default-value

以下是相关代码:

#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总是错误的。

我断开了getter和setter(我把它们放在那里用于调试目的,我知道这不是Java)并且发现setter确实将变量设置为true,但后续调用getAwareness会显示teamAwareness为false(之间没有setAwareness调用)...这怎么可能?我该如何解决?

1 个答案:

答案 0 :(得分:3)

具有静态生命周期的变量始终为零初始化。其中包括:

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

零初始化,简化,意味着:

  • 如果是数字类型:0
  • 如果是bool:false
  • 如果是指针:NULL
  • 如果是enum:0强制转换为枚举类型
  • 如果是类型:默认构造。

但是你的问题与此无关,这是因为你的变量被声明为static并且它在一个头文件中,所以包含它的每个编译单元(.cpp文件)实际上都看到了它自己的实例变量。如果您从一个.cpp文件更改它,您将看不到另一个.c /更改。

您要做的是在.h文件中声明变量extern,然后在任何.cpp文件中正常定义它(不带修饰符):

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

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

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

顺便说一下,函数更好地声明为inline