我有一个包含以下代码的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
常量时,一切正常。
怎么可能?
答案 0 :(得分:2)
我认为,问题在于你的全局变量,准确的是它的初始化。
如果在调用Pixels2Meters()
时变量尚未动态初始化,则变量PixelsPerMeter
静态初始化为零,所以函数Pixels2Meters()
返回inf
,其中非常暗示PixelsPerMeter
为零。
但是你提出了突破点,故事可能略有不同;它类似于Heisenberg uncertainty principle,在某种意义上,当你想通过放置断点来查看PixelsPerMeter
的值时,它会显示与没有断点时的值不同的值。
另请注意,由于变量声明为const
,而没有extern
关键字,因此变量具有内部链接,这意味着您将在每个翻译单元中拥有此变量的不同副本,以防万一在包含在多个源文件中的头文件中声明。变量的行为就像声明static
一样。
要注意的另一个重要要点是此变量初始化两次:第一次初始化称为静态初始化,它在编译时发生,第二次初始化被调用动态初始化在运行时发生。在静态初始化的情况下,变量初始化为零,这是导致问题的正在使用的值。要了解更多信息,请阅读:
您还应该阅读以下内容:
答案 1 :(得分:0)
初始化静态函数时有点复杂,可能依赖于系统/编译器。
您可能遇到一个问题,即ConfigManager()在您使用静态函数之前未初始化。