1

早上好。

我在使用 c++ 的 Visual Studio 2008 解决方案上有以下定义(这个程序是由在我之前在这里工作的人创建的):

[DllImport("msvcr70.dll", CallingConvention = CallingConvention::Cdecl)]
extern int _fpreset();

这条线完美无缺,我可以在代码上调用 _fpreset。

由于我们需要将其实现为 64 位应用程序,因此我安装了 Visual Studio 2010。从存储库下载解决方案后,它会要求我进行转换才能正常工作。我单击是,当我尝试编译程序时,出现以下错误:

error C2556:'int _fpreset(void)': overloaded functions only differ by return type with 'void _fpreset(void)'

当我在 Visual Studio 2008 中再次尝试时,它完美地工作......

任何想法为什么它在 2010 年不起作用?

4

1 回答 1

2

声明是错误的。你现在被提醒了,因为你 #include 引入了 float.h 的其他一些 VS2010 .h 文件,它是声明 _fpreset() 的头文件。这给出了这个 CRT 函数的正确声明,返回类型为void

您应该删除这个 [DllImport] 声明,不仅因为它是错误的,而且它还使您的程序依赖于古老的 VS2002 CRT (msvcr70.dll)。将此添加到实际调用 _fpreset() 的任何源代码文件中:

 #include <float.h>

在托管代码中调用 _fpreset() 非常有问题,只有在调用弄乱 FPU 控制字的本机代码时才这样做。

于 2013-01-28T19:49:03.070 回答