Visual c++ 从VS6移植到VS2012:返回值出错

Visual c++ 从VS6移植到VS2012:返回值出错,visual-c++,visual-studio-2012,visual-studio-6,Visual C++,Visual Studio 2012,Visual Studio 6,在将VS6项目移植到VC++2012环境时,我遇到了一个奇怪的行为 假设我有以下几点 // double AreaIco = 75.0; // double theApp.m_GlobalScale = 0.25; double ToLong(double); // elsewhere defined double result = ToLong(AreaIco * theApp.m_GlobalScale * theApp.m_GlobalScale); 我发现ToLong函数的输入参数是“

在将VS6项目移植到VC++2012环境时,我遇到了一个奇怪的行为

假设我有以下几点

// double AreaIco = 75.0;
// double theApp.m_GlobalScale = 0.25;
double ToLong(double); // elsewhere defined
double result = ToLong(AreaIco * theApp.m_GlobalScale * theApp.m_GlobalScale);
我发现ToLong函数的输入参数是“0”

如果我尝试引入临时变量,也会发生这种情况:

double temp1 = AreaIco * theApp.m_GlobalScale;
double temp2 = temp1 * theApp.m_GlobalScale;
AreaIcoInScala = ToLong(temp2);
temp1和temp2计算为0或非规范化值

但是,尝试在QuickWatch中计算表达式会返回正确的值

有人对这种行为有任何线索吗?我担心代码中有一些古老的bug,从现在起,VS6中的某些人就开始考虑这些bug了


无论如何,感谢所有人的支持。

经过进一步调查,我们发现这是数据结构对齐的问题。 在VS选项中,结构成员对齐设置为4字节,而其中一个源文件中存在#pragma pack 2


奇怪的是,一切都在VS6下工作,移植到VS2012导致了这个问题。

经过进一步的调查,我们发现这是数据结构对齐的问题。 在VS选项中,结构成员对齐设置为4字节,而其中一个源文件中存在#pragma pack 2


奇怪的是,一切都在VS6下工作,移植到VS2012使这个问题浮出水面。

什么是ToLong?您是否忘记了标记?ToLong的参数类型是什么?而app.m_GlobalScale和app.GlobalScale之间的区别是什么呢?问题显然出在
ToLong
,您没有显示。该函数在何处以及如何定义?我知道的唯一的
ToLong
是一个.NET函数,因此在VS6中不可用。很抱歉,该函数是在项目中定义的。但是问题并不存在,因为1)函数实际上接收到错误的输入参数-我的帖子中显示的乘法计算结果为0或非规范化值2)如果我尝试进行乘法,将其分配给临时值(temp1和temp2),并将该临时值传递给ToLong()函数,临时值本身显示错误值(0或非规范化);在这种情况下,根本不调用ToLong。在这种情况下,以下内容也应解析为零:
double temp1=75.0*0.25我打赌它不会。所以,一定有什么东西你没有给我们看。您是否检查过操作数在初始化后没有损坏?ToLong是什么?您是否忘记了标记?ToLong
的参数类型是什么?而app.m_GlobalScale和app.GlobalScale之间的区别是什么呢?问题显然出在
ToLong
,您没有显示。该函数在何处以及如何定义?我知道的唯一的
ToLong
是一个.NET函数,因此在VS6中不可用。很抱歉,该函数是在项目中定义的。但是问题并不存在,因为1)函数实际上接收到错误的输入参数-我的帖子中显示的乘法计算结果为0或非规范化值2)如果我尝试进行乘法,将其分配给临时值(temp1和temp2),并将该临时值传递给ToLong()函数,临时值本身显示错误值(0或非规范化);在这种情况下,根本不调用ToLong。在这种情况下,以下内容也应解析为零:
double temp1=75.0*0.25我打赌它不会。所以,一定有什么东西你没有给我们看。您是否检查过操作数在初始化后没有损坏?这是因为默认打包在VS版本之间更改了几次。这是因为默认打包在VS版本之间更改了几次。