常数值计算

时间:2011-12-05 04:44:18

标签: c++

我有一个包含以下代码的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常量时,一切正常。

怎么可能?

2 个答案:

答案 0 :(得分:2)

我认为,问题在于你的全局变量,准确的是它的初始化。

如果在调用Pixels2Meters()时变量尚未动态初始化,则变量PixelsPerMeter 静态初始化为零,所以函数Pixels2Meters()返回inf,其中非常暗示PixelsPerMeter为零。

但是你提出了突破点,故事可能略有不同;它类似于Heisenberg uncertainty principle,在某种意义上,当你想通过放置断点来查看PixelsPerMeter的值时,它会显示与没有断点时的值不同的值。

另请注意,由于变量声明为const,而没有extern关键字,因此变量具有内部链接,这意味着您将在每个翻译单元中拥有此变量的不同副本,以防万一在包含在多个源文件中的头文件中声明。变量的行为就像声明static一样。

要注意的另一个重要要点是此变量初始化两次:第一次初始化称为静态初始化,它在编译时发生,第二次初始化被调用动态初始化在运行时发生。在静态初始化的情况下,变量初始化为零,这是导致问题的正在使用的值。要了解更多信息,请阅读:

您还应该阅读以下内容:

答案 1 :(得分:0)

初始化静态函数时有点复杂,可能依赖于系统/编译器。

您可能遇到一个问题,即ConfigManager()在您使用静态函数之前未初始化。