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

时间:2013-10-02 11:40:40

标签: c++ variables static namespaces global

所以在我的命名空间的.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();

第一个显示()从LoadIdentity()函数中将标识矩阵打印到屏幕,但是第二个(在函数返回后)显示全零。 为什么我的价值观消失了? 有没有不同的方式我应该做我的全球? 感谢

3 个答案:

答案 0 :(得分:5)

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

而是你需要使它成为一个全局(虽然命名空间范围)变量。

在头文件中:

namespace wtvr{
extern Matrix m;
};

在任何.cpp文件中:

namespace wtvr{
Matrix m;
};

答案 1 :(得分:2)

您已将变量声明为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
}

}

答案 2 :(得分:1)

是的,你应该采用不同的方式来实现全球化。

在.h文件中:

extern Matrix m;

在.cpp文件中:

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

没有其他文件需要更改。文件范围中的static表示每个文件都有自己的变量副本,该变量没有与其他文件的变量副本链接,这与您想要的相反。