C++ 名称空间上的变量总是有默认值吗?
下面是有问题的代码:C++ 名称空间上的变量总是有默认值吗?,c++,namespaces,default-value,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
#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
问题是团队意识总是错误的
我将getter和setter(我将它们放在那里用于调试目的,我知道这不是Java)断点,并发现setter确实将变量设置为true,但随后对getAwareness的调用显示teamAwareness为false(其间没有setAwareness调用)。。。这怎么可能呢?如何修复它?具有静态生存期的变量总是初始化为零。这些措施包括:
- 名称空间变量(包括全局名称空间),无论是静态的还是非静态的
- 局部静态变量
- 成员静态变量
- 如果是数字类型:0
- 如果是布尔:错
- 如果是指针:NULL
- 如果是枚举:0,则强制转换为枚举类型
- 如果是类类型:默认构造
static
,并且它位于头文件中,因此包含它的每个编译单元(.cpp文件)实际上都会看到它自己的变量实例。如果您从一个.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;
}
顺便说一句,函数最好声明为
inline
静态生存期的变量总是初始化为零。这些措施包括:
- 名称空间变量(包括全局名称空间),无论是静态的还是非静态的
- 局部静态变量
- 成员静态变量
- 如果是数字类型:0
- 如果是布尔:错
- 如果是指针:NULL
- 如果是枚举:0,则强制转换为枚举类型
- 如果是类类型:默认构造
static
,并且它位于头文件中,因此包含它的每个编译单元(.cpp文件)实际上都会看到它自己的变量实例。如果您从一个.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;
}
顺便说一句,该函数最好声明为
inline
我无法重现您的错误。我从getter获得true
或false
,这取决于我给setter的是什么。我在一个不太了解的引擎中使用这个代码?有没有办法知道引擎不知怎么搞砸了我的代码?换句话说,当变量发生变化时,我如何设置断点?对TeamAware的唯一引用是get和set,这正是我想要的。这个头文件包括多少个位置?每个地方都有一个名为teamAwareness
的变量的副本,因为您将其声明为static
@Drknezz:在头文件中将static
更改为extern
,然后在.cpp文件中定义变量:名称空间AlterFPS{namespace Global{bool teamAwareness;int teams[]={0,0};}}
我无法重现您的错误。我从getter获得true
或false
,这取决于我给setter的是什么。我在一个不太了解的引擎中使用这个代码?有没有办法知道引擎不知怎么搞砸了我的代码?换句话说,当变量发生变化时,我如何设置断点?对TeamAware的唯一引用是get和set,这正是我想要的。这个头文件包括多少个位置?每个地方都有一个名为teamAwareness
的变量的副本,因为您将其声明为static
@Drknezz:在头文件中将static
更改为extern
,然后在.cpp文件中定义变量:名称空间AlterFPS{namespace Global{bool teamAwareness;int teams[]={0,0};}}