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

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

4

1 回答 1

3

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

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

零初始化,使其变得简单,意味着:

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

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

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

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

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

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

顺便说一句,该函数更好地声明inline

于 2012-05-01T20:33:23.953 回答