具有静态变量的静态功能的C 奇怪行为
c++ strange behavior of static function with static variables
我正在尝试创建一堆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()
印刷的版本。
相关文章:
- 如何在C++中获得"静态纯虚拟"功能?
- 当我链接两个静态C++库时,我可以在两个主函数库中有两个主要功能吗?
- 共享库中静态功能成员的破坏顺序
- 当使用嵌套类功能时,使用非静态数据成员的使用无效,但是当函数未固定时可以
- C 11螺纹 - 非静态成员功能的使用无效 - 工作GCC 5.1.0损坏的GCC 7.3.1
- 在CPP中访问静态功能的指针
- 模板类中的静态功能:GCC与VS
- 为什么“静态”功能在不同的tu中不会破坏ODR
- 模板静态功能模板类类型扣除
- 在编译时检查课堂中是否可以使用静态功能
- 尝试在静态功能(C )中使用lambda函数
- 在C 中使用静态功能,我的教授希望我告诉Main哪个对象具有最高优先级,而无需传递任何内容
- 是否有标准的静态功能包装器类型模板
- 无法在不同类上编译代码调用静态功能
- 必须调用对非静态功能的引用
- 通过网络将指针发送到静态功能是安全的吗?
- 具有静态变量的静态功能的C 奇怪行为
- 功能比较器可以是静态功能
- 类静态功能外部链接
- 热狗站静态功能问题