我正在尝试创建一堆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
感谢您的阅读。
答案 0 :(得分:4)
全局静态变量在一个编译单元中是静态的。如果您创建另一个编译单元,它将具有该静态变量的单独副本。
This SO question解释了C ++中的编译单元。
由于您的变量同时是 static 和 global ,因此在它的编译单元中会有一个实例。如果要从其他文件访问该确切变量,则必须使用extern
关键字。没有它,将在每个编译单元中创建该变量的新副本。例如,您可以找到一些信息here。
答案 1 :(得分:3)
这不是一个类,它是一个命名空间。命名空间内或全局范围内的static
给出方法和变量内部链接。这意味着每个翻译单元都有一份副本。
因为您在sfloat
中修改了( not initialize )otherFile.cpp
,所以只修改了该版本的变量。在.cpp file
中初始化的原始文件保留了相同的值(即someNamespace::foo()
打印的版本。