命名空间全局变量丢失值 (C++)

namespace global variable losing value (C++)

本文关键字:C++ 全局变量 命名空间      更新时间:2023-10-16

所以在我的命名空间的 .h 文件中,我有

namespace wtvr{
    static Matrix m;
    void LoadIdentity(void);
};

在其.cpp文件中,我有

namespace wtvr{
    void LoadIdentity(void){
        m = Identity();
        m.display();// trace for debugging
    }
};

其他在主程序中的位置

wtvr::LoadIdentity();
wtvr::m.display();

第一个 display() 从 LoadIdentity() 函数中将单位矩阵打印到屏幕上,但第二个(在函数返回后)显示所有零。为什么我的价值观消失了?我应该以不同的方式实现全球化吗?谢谢

您已在头文件中声明了static Matrix m;。这意味着包含该标头的每个.cpp文件都将获得自己的 m 版本。

相反,您需要使其成为全局(尽管是命名空间范围的)变量。

在头文件中:

namespace wtvr{
extern Matrix m;
};

在.cpp的任何文件中:

namespace wtvr{
Matrix m;
};

您已将变量声明为 static ,这意味着每个翻译单元(.cpp文件)都有自己的副本。你可能的意思是:

.h 文件:

namespace wtvr{
extern Matrix m;  //declare for use from everywhere
void LoadIdentity(void);
}

.cpp文件:

namespace wtvr{
Matrix m;  //define in exactly one .cpp file
void LoadIdentity(void)
{
  m = Identity();
  m.display();// trace for debugging
}
}

是的,您应该以不同的方式进行全局化。

在 .h 文件中:

extern Matrix m;

在其.cpp文件中:

Matrix m;
void LoadIdentity(void)
{
    m = Identity();
    m.display();
}

无需更改其他文件。 文件范围内的static意味着每个文件都会获得自己的变量副本,该副本不与其他文件的变量副本链接,这与您想要的相反。