c ++静态函数与静态变量的奇怪行为

时间:2012-10-18 07:21:17

标签: c++ function variables static

我正在尝试创建一堆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

感谢您的阅读。

2 个答案:

答案 0 :(得分:4)

全局静态变量在一个编译单元中是静态的。如果您创建另一个编译单元,它将具有该静态变量的单独副本。

This SO question解释了C ++中的编译单元。

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

答案 1 :(得分:3)

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

因为您在sfloat中修改了( not initialize otherFile.cpp,所以只修改了该版本的变量。在.cpp file中初始化的原始文件保留了相同的值(即someNamespace::foo()打印的版本。