Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 文件范围和静态浮动_C++_Memory_Static_Scope - Fatal编程技术网

C++ 文件范围和静态浮动

C++ 文件范围和静态浮动,c++,memory,static,scope,C++,Memory,Static,Scope,我在我的一个人工智能项目中遇到了一个有趣的问题。我试图格式化一些调试文本,但发生了一些奇怪的事情。下面是一段代码: float ratio = 1.0f / TIME_MOD; TIME_MOD是一个静态浮点,在单独的文件中声明。这个值是根据另一个类中的用户输入修改的。我已经验证了这个值在仍然在输入函数的范围内调试时发生了更改,但是每当我在我的外部循环中尝试除以它时,我都会得到相同的数字。1除以时间的初始值 是否缺少有关静态变量和文件范围的内容?静态变量仅存在于当前编译单元中。从其定义

我在我的一个人工智能项目中遇到了一个有趣的问题。我试图格式化一些调试文本,但发生了一些奇怪的事情。下面是一段代码:

    float ratio = 1.0f / TIME_MOD;
TIME_MOD是一个静态浮点,在单独的文件中声明。这个值是根据另一个类中的用户输入修改的。我已经验证了这个值在仍然在输入函数的范围内调试时发生了更改,但是每当我在我的外部循环中尝试除以它时,我都会得到相同的数字。1除以时间的初始值


是否缺少有关静态变量和文件范围的内容?

静态变量仅存在于当前编译单元中。从其定义中删除static并将其更改为volatile,尽管这假设您使用的是多个线程,如果不是,您不需要使用volatile,而且一切都应该正常

编辑:根据你的回答,我假设你有如下代码

A.cpp:

static float TIME_MOD = <some value>;
float TIME_MOD = <some value>;
然后像往常一样使用TIME_MOD。这告诉编译器TIME_MOD在其他地方,不必担心不知道它包含什么。然后链接器将遍历并将此浮动时间_MOD定义链接到正确的定义

还值得指出的是,它可能是具有外部浮动时间的工作;在某个地方的头文件中,并将其包含在您需要的任何CPP文件中。仍然将实际定义(即非外部定义)保留在一个文件中,且仅保留一个文件


这当然可以解释这样一个事实,即我认为您正在外接一个我认为不可能的静态变量。

静态变量只存在于当前编译单元中。从其定义中删除static并将其更改为volatile,尽管这假设您使用的是多个线程,如果不是,您不需要使用volatile,而且一切都应该正常

编辑:根据你的回答,我假设你有如下代码

A.cpp:

static float TIME_MOD = <some value>;
float TIME_MOD = <some value>;
然后像往常一样使用TIME_MOD。这告诉编译器TIME_MOD在其他地方,不必担心不知道它包含什么。然后链接器将遍历并将此浮动时间_MOD定义链接到正确的定义

还值得指出的是,它可能是具有外部浮动时间的工作;在某个地方的头文件中,并将其包含在您需要的任何CPP文件中。仍然将实际定义(即非外部定义)保留在一个文件中,且仅保留一个文件


这当然可以解释这样一个事实,即我认为您正在外接一个静态变量,而我认为这是不可能的。

您可以将静态变量更改为define,并在单例中设置一个等于它的成员变量。修改和访问将应用于singleton的成员变量。

您可以将静态变量更改为define,并将singleton中的成员变量设置为与其相等。修改和访问将应用于singleton的成员变量。

静态变量在内部链接。无法访问在其他源文件中定义的静态变量。 如果在某些头文件中定义了静态变量TIME_MOD,则可能会出现这种情况。在输入和比率源文件中都包含相同的头文件,因此这两个文件都有变量TIME_MOD的私有副本, 现在,输入模块更改了TIME_MOD值,但它修改了自己的私有副本,因此比率文件中的值保持不变,因此您的行为保持不变


现在,如果是这种情况,您不需要静态时间模块,并且为了解决名称冲突,您可能需要使用名称空间。

静态变量在内部链接。无法访问在其他源文件中定义的静态变量。 如果在某些头文件中定义了静态变量TIME_MOD,则可能会出现这种情况。在输入和比率源文件中都包含相同的头文件,因此这两个文件都有变量TIME_MOD的私有副本, 现在,输入模块更改了TIME_MOD值,但它修改了自己的私有副本,因此比率文件中的值保持不变,因此您的行为保持不变


现在,如果是这种情况,您不需要静态时间模块,并且为了解决名称冲突,您可能喜欢使用名称空间。

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

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

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

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

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

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

关键字static 静态的效果取决于上下文:

如果在全局/命名空间范围内声明或定义对象,则该对象始终是具有静态存储持续时间的对象。在全局/命名空间范围内使用关键字static根本不会影响存储持续时间。相反,它会影响联动。它声明实体(也可能是函数)具有内部链接。因此,存储类说明符被错误地用于执行完全不同的操作:强制内部链接。在这种情况下,它有点与外部环境相反。在C++中,可以用匿名命名空间实现相同的效果。我们鼓励您选择匿名名称空间而不是静态名称空间,以尽量减少混淆

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

函数范围内的静态可用于声明具有静态存储持续时间的对象,该存储持续时间是延迟初始化的

若你们说的是静态变量,那个么并不清楚你们的确切意思。您指的是静态存储持续时间还是内部链接

如果要跨翻译单元共享全局变量,必须在头文件中将其声明为具有外部链接的实体,并在一个翻译单元中定义它。请注意,未使用关键字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;
}

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

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

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

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

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

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

关键字static 静态的效果取决于上下文:

如果在全局/命名空间范围内声明或定义对象,则该对象始终是具有静态存储持续时间的对象。在全局/命名空间范围内使用关键字static根本不会影响存储持续时间。相反,它会影响联动。它声明实体(也可能是函数)具有内部链接。因此,存储类说明符被错误地用于执行完全不同的操作:强制内部链接。在这种情况下,它有点与外部环境相反。在C++中,可以用匿名命名空间实现相同的效果。我们鼓励您选择匿名名称空间而不是st 尽量减少混乱

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

函数范围内的静态可用于声明具有静态存储持续时间的对象,该存储持续时间是延迟初始化的

若你们说的是静态变量,那个么并不清楚你们的确切意思。您指的是静态存储持续时间还是内部链接

如果要跨翻译单元共享全局变量,必须在头文件中将其声明为具有外部链接的实体,并在一个翻译单元中定义它。请注意,未使用关键字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;
}

我猜您在头文件中将这个变量声明为:static float TIME_MOD; 并将此文件包含在cpps中。通过这样做,您可以在每个编译单元中有效地创建相同命名变量的单独实例。 您应该将声明更改为:extern float TIME_MOD;
并在其中一个CPP中定义变量:float TIME_MOD=0

我猜您在头文件中将这个变量声明为:static float TIME_MOD; 并将此文件包含在cpps中。通过这样做,您可以在每个编译单元中有效地创建相同命名变量的单独实例。 您应该将声明更改为:extern float TIME_MOD;

并在其中一个CPP中定义变量:float TIME_MOD=0

我认为你不能把静态变量外置。因此,我没有在比率文件中声明它;在这种情况下,它是具有内部链接的浮点变量的定义。每个翻译单元都有自己的浮点值,称为TIME_MOD。只是不要在全局和命名空间范围内使用static。它不能做你认为它能做的。我认为你不能把静态变量外部化。因此,我没有在比率文件中声明它;在这种情况下,它是具有内部链接的浮点变量的定义。每个翻译单元都有自己的浮点值,称为TIME_MOD。只是不要在全局和命名空间范围内使用static。如果我让它不稳定,我会收到一堆链接器错误,告诉我它已经在Camera.obj类中定义了,我正在用它修改值。我的一位教授告诉我,人们应该避免让除布尔语以外的任何东西变得易变,但我不记得他的推理。你知道为什么VisualStudio认为我对这个易变浮点数的赋值是一个重新定义吗?不是没有看到你的代码。。。你是真的在外接TIME_MOD,还是仅仅在多个编译单元中将其定义为静态,并希望它们都指向相同的值?我在一个文件中有一个静态声明。没有呼叫外部人员。不能将静态数据外部化。问题已经解决了。请参阅我的回复帖子。如果我将其设置为volatile,我会收到一系列链接器错误,告诉我它已经在Camera.obj类中定义了,我正在使用该类修改值。我的一位教授告诉我,人们应该避免让除布尔语以外的任何东西变得易变,但我不记得他的推理。你知道为什么VisualStudio认为我对这个易变浮点数的赋值是一个重新定义吗?不是没有看到你的代码。。。你是真的在外接TIME_MOD,还是仅仅在多个编译单元中将其定义为静态,并希望它们都指向相同的值?我在一个文件中有一个静态声明。没有呼叫外部人员。不能将静态数据外部化。问题已经解决了。请看我的回帖。所以。。这并不能解释答案。我很想知道你做错了什么…所以。。这并不能解释答案。我很想知道你做错了什么……我熟悉“static”的类和函数范围,但我很难理解你的第一个要点。“静态存储持续时间”是指在程序终止之前,变量不会超出范围吗?我使用extern来访问数据,比如一个大的、硬编码的数组或另一个文件中定义的设备上下文。我假设extern int k将允许以下文件范围内的对象引用包含文件中定义的int k?我喜欢你的回答。我只是想确保我完全理解它。@Rantaak:我已经添加了一些内容作为对你评论的回应。你需要修改你的描述,因为它仍然令人困惑,我知道你想说什么。在要点中,仅描述关键字的作用。静态存储持续时间是关键字的一个独立概念,应该在它自己的段落中单独描述。我重写了答案。我希望它不那么令人困惑:@Rantaak:static storage duration意味着它总是存在的,而不是它总是在范围内。范围和存在
它们不是同义词。不要包含定义,只包含声明。头文件通常不应该是实例化的,而应该是去极化的。实例定义应存在于单独编译和链接的文件中。当然,在任何情况下,您都应该避免使用所有这些全局数据。我熟悉“static”的类和函数范围,但我很难理解您的第一个要点。“静态存储持续时间”是指在程序终止之前,变量不会超出范围吗?我使用extern来访问数据,比如一个大的、硬编码的数组或另一个文件中定义的设备上下文。我假设extern int k将允许以下文件范围内的对象引用包含文件中定义的int k?我喜欢你的回答。我只是想确保我完全理解它。@Rantaak:我已经添加了一些内容作为对你评论的回应。你需要修改你的描述,因为它仍然令人困惑,我知道你想说什么。在要点中,仅描述关键字的作用。静态存储持续时间是关键字的一个独立概念,应该在它自己的段落中单独描述。我重写了答案。我希望它不那么令人困惑:@Rantaak:static storage duration意味着它总是存在的,而不是它总是在范围内。范围和存在不是同义词。不要包含定义,只包含声明。头文件通常不应该是实例化的,而应该是去极化的。实例定义应存在于单独编译和链接的文件中。当然,在任何情况下,您都应该避免使用所有这些全局数据。