我有一个带有以下代码的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),ScreenSizeX
和ScreenSizeY
的值。一切正常,但ScreenArea
计算错误。当我直接编写
Pixels2Meters(ScreenSizeX) * Pixels2Meters(ScreenSizeY)
而不是使用ScreenArea
常量时,一切正常。怎么可能
最佳答案
我认为问题在于您的全局变量,确切地说,是其初始化。
如果在调用Pixels2Meters()
时尚未对变量进行动态初始化,则变量PixelsPerMeter
静态初始化为零,因此函数Pixels2Meters()
返回inf
,这非常意味着PixelsPerMeter
为零。
但是,您设置了断点,故事可能会有所不同。它类似于Heisenberg uncertainty principle,在某种意义上,当您希望通过放置断点来查看PixelsPerMeter
的值时,它显示的值与没有断点时的值不同。
还要注意,由于该变量声明为const
,而没有extern
关键字,因此该变量具有内部链接,这意味着,如果在包含在多个源代码中的头文件中声明了该变量,则每个翻译单元中该变量的副本不同文件。变量的行为就像声明为static
一样。
需要注意的另一个重要要点是,此变量被初始化两次:第一个初始化称为静态初始化,在编译时发生,而第二个初始化称为动态初始化,在运行时发生。在静态初始化的情况下,变量被初始化为零,这就是所使用的值,这会引起问题。要了解更多信息,请阅读以下内容:
您还应该阅读以下内容:
static
initialization order fiasco 关于c++ - 常数值计算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8381121/