1

我正在尝试创建一堆 void 方法并稍后在程序中调用它们。我将在前面演示代码,以帮助更好地理解我的问题。

.h file
static float sfloat;
namespace someNamespace
{
static void foo();
}
.cpp file
void someNamespace::foo(){cout<<sfloat<<endl}
  • 上面的代码是我正在研究的类的更简单版本。

我在其他 .cpp 文件中初始化 sfloat

otherFile.cpp
void initializeAndUseFoo(){sfloat = 5; someNamespace::foo();}

据我了解,我希望 foo 打印出 5 但它会打印出 0 。这种行为发生在我拥有的所有其他静态变量(包括指针)中。似乎不知何故,函数内部的变量从未初始化为我分配的值。

但是,如果我不通过函数调用“sfloat”,那么我可以正确调用它。(如果我只是在控制台上打印出来

cout<<"just print it not through the function : " <<sfloat<<endl;

那么它确实是5

感谢您的阅读。

4

2 回答 2

4

全局静态变量在一个编译单元内是静态的。如果您制作另一个编译单元,它将拥有该静态变量的单独副本。

这个 SO question解释了 C++ 中的编译单元是什么。

由于您的变量同时是静态的和全局的,因此在它的编译单元中将有一个它的实例。如果要从另一个文件访问该确切变量,则必须使用extern关键字。没有它,将在每个编译单元中创建该变量的新副本。例如,您可以在此处找到一些信息。

于 2012-10-18T07:23:47.107 回答
3

那不是一个类,它是一个命名空间。static在命名空间内或在全局范围内提供方法和变量的内部链接。这意味着每个翻译单元都有一份副本。

因为您在 中修改(而不是初始化sfloatotherFile.cpp所以只修改了该版本的变量。原始的,在 中初始化.cpp file,保留相同的值(这是由someNamespace::foo().

于 2012-10-18T07:24:12.643 回答