具有静态变量的静态功能的C 奇怪行为

c++ strange behavior of static function with static variables

本文关键字:静态 功能 变量      更新时间:2023-10-16

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

感谢您的阅读。

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

这个问题解释了C 中的汇编单元。

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

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

因为您修改(未在otherFile.cpp中初始化sfloat,因此仅修改了该变量的版本。在.cpp file初始初始化的原始值保留了相同的值(这是someNamespace::foo()印刷的版本。