我有一个带有以下代码的hpp文件:

const float PixelsPerMeter = ConfigManager->Get<float>("koef", 100.0f);

inline const float Meters2Pixels(float meters) { return meters * PixelsPerMeter; }
inline const float Pixels2Meters(float pixels) { return pixels / PixelsPerMeter; }

const float ScreenArea = Pixels2Meters(ScreenSizeX) * Pixels2Meters(ScreenSizeY);

以前可以使用,但现在ScreenArea = inf。我从静态功能使用它。我在该函数中设置了一个断点,并打印出PixelsPerMeter(100.0),ScreenSizeXScreenSizeY的值。一切正常,但ScreenArea计算错误。

当我直接编写Pixels2Meters(ScreenSizeX) * Pixels2Meters(ScreenSizeY)而不是使用ScreenArea常量时,一切正常。

怎么可能

最佳答案

我认为问题在于您的全局变量,确切地说,是其初始化。

如果在调用Pixels2Meters()时尚未对变量进行动态初始化,则变量PixelsPerMeter静态初始化为零,因此函数Pixels2Meters()返回inf,这非常意味着PixelsPerMeter为零。

但是,您设置了断点,故事可能会有所不同。它类似于Heisenberg uncertainty principle,在某种意义上,当您希望通过放置断点来查看PixelsPerMeter的值时,它显示的值与没有断点时的值不同。

还要注意,由于该变量声明为const,而没有extern关键字,因此该变量具有内部链接,这意味着,如果在包含在多个源代码中的头文件中声明了该变量,则每个翻译单元中该变量的副本不同文件。变量的行为就像声明为static一样。

需要注意的另一个重要要点是,此变量被初始化两次:第一个初始化称为静态初始化,在编译时发生,而第二个初始化称为动态初始化,在运行时发生。在静态初始化的情况下,变量被初始化为零,这就是所使用的值,这会引起问题。要了解更多信息,请阅读以下内容:

  • What is dynamic initialization of object in c++?

  • 您还应该阅读以下内容:
  • static initialization order fiasco
  • 关于c++ - 常数值计算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8381121/

    10-11 19:39