文件范围和静态浮点数

Ran*_*aak 1 c++ memory static scope

我在我的AI项目中遇到了一个有趣的问题.我正在尝试格式化一些调试文本,并且发生了一些奇怪的事情.这是一段代码:

    float ratio = 1.0f / TIME_MOD;
Run Code Online (Sandbox Code Playgroud)

TIME_MOD是一个静态浮点数,在单独的文件中声明.这个值是基于另一个类中的用户输入修改的(我已经验证了值在"input"函数的范围内仍在调试时被更改),但每当我尝试在外部循环中除以它时,我得到了相同的号码.(1除以TIME_MOD的初始值).

我是否遗漏了有关静态变量和文件范围的内容?

sel*_*tze 15

我认为与"静态"这个词有些混淆.我们有一个关键字static在不同的上下文中执行不同的操作,我们使用"静态"一词来命名三类"存储持续时间"中的一个.在某些情况下static,不控制对象的存储持续时间,而只控制"链接",这可能是造成混淆的主要原因.


存储持续时间

存储持续时间是对象的属性.

  • 具有静态存储持续时间的对象的内存仅分配一次和一次.初始化取决于对象的类型和定义的位置.一旦初始化,它通常会保持活着,直到执行主要结束.在全局/命名空间范围内声明和定义的对象始终具有静态存储持续时间.

  • 具有自动存储持续时间的对象只能在函数块内定义.执行到达定义时会创建这样的对象.这可能会多次发生(递归),从而创建多个对象.当执行离开块时,对象会自动销毁.

  • 动态分配的对象具有动态存储持续时间.在这种情况下,用户通过new,new [],delete,delete []等控制对象的生命周期.


连锁

内部与外部联系是关于翻译单位名称的可见性.如果您使用外部链接声明某些内容,则引入一个名称,该名称可以在其他翻译单元中使用,只要这些其他TU包含正确的声明(通常包含在头文件中),就可以引用同一实体.如果您使用内部链接定义某些内容,则无法通过名称从另一个翻译单元访问它.您甚至可以定义多个具有相同名称的实体(每个TU一个),只要您只有一个具有外部链接的实体.


关键字"静态"

效果static取决于上下文:

  • 如果在全局/命名空间范围内声明或定义对象,则它始终是具有"静态存储持续时间"的对象.static在全局/命名空间范围内使用关键字根本不会影响存储持续时间.相反,它会影响联系.它声明实体 - 也可能是一个函数 - 具有内部链接.因此,存储类说明符被"误用"以完成不同的操作:强制执行内部链接.extern在这种情况下,它与此相反.在C++中,您可以使用匿名命名空间实现相同的效果.我们鼓励您更喜欢使用匿名命名空间static来"最大限度地减少混淆".

  • static类范围可用于在类的范围内声明具有静态存储持续时间的对象.每个对象只有一个这样的变量,而不是一个.

  • static at function scope可用于声明具有懒惰初始化的静态存储持续时间的对象


如果你说"静态变量",你不清楚你的意思.您是指"静态存储持续时间"还是"内部链接"?

如果要跨翻译单元共享"全局"变量,则必须在头文件中将其声明为具有外部链接的实体,并将其定义在一个翻译单元中.请注意,static不使用关键字:

// myheader.hpp
extern int k; // declaring an int variable with external linkage

// foo.cpp
#include "myheader.hpp"
int k;        // defining an int variable with external linkage

// bar.cpp
#include "myheader.hpp"
int main() {
    return k;
}
Run Code Online (Sandbox Code Playgroud)