【发布时间】:2014-02-03 10:53:39
【问题描述】:
我正在使用 Embarcadero RAD Studio 的评估版。对于静态库中的代码和主应用程序中的代码,我得到了不同的 DBL_MAX 值。
代码是
双倍 x = DBL_MAX;
在静态库中的代码中,x 被分配了不正确的值 ~1.449E-125。在主应用程序的代码中,x 被分配了正确的值 ~1.79E+308。
我的第一个想法是库代码#include 了一些错误地定义了值的东西,但我在它的任何源或标题中都找不到任何这样的定义。
我的另一个想法是std:_max_dble的初始化可能有问题,在DBL_MAX的定义中用到了。
为了重现该问题,我仅使用此源创建了一个 C++ Builder 静态库(在 Windows 7 上):
#include "Unit1.h"
#include <float.h>
double TestDblMax()
{
double x(DBL_MAX);
return x;
}
将库链接到 VCL 表单应用程序,并从表单构造函数中调用它,作为该构造函数中的第一条语句。结果是~1.449E-125。
【问题讨论】:
-
你怎么知道值?尝试不分配它,而是直接从库中打印它,例如
void printDblMax() { cout << DBL_MAX; }。这可能是初始化顺序或链接错误的问题。 -
我知道这些值,因为我在设置断点后在调试器中检查了它们。 (请注意,我没有先仔细检查我的事实就发布问题的习惯。)这些是函数中的自动堆栈变量,因此在函数执行时会被初始化。
-
@GrahamAsher:实际上,就标准而言,它们不需要在函数执行时进行初始化,但只有在可观察操作需要它们时才需要初始化 - 例如@987654323 @。即使这样,编译器也可能只是用
std::cout << DBL_MAX替换它,因为不会有明显的区别——调试器不算在内。 -
我觉得你需要证明SSCCE有问题
-
在调试版本中,变量的值是可靠的。此外,提到的值是在代码中使用的,我在实际使用时对其进行了检查。它具有不正确的值这一事实导致了一个错误,这就是我开始研究它的原因。该错误存在于一个大型商业库中,可以在其他平台上完美运行。
标签: c++ c++builder