1

おはよう。

私は、c++を使用したVisualStudio 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する他のVS2010.hファイルが_fpreset()を宣言するヘッダーファイルであるfloat.hをプルするため、このことを思い出します。これにより、returnタイプがvoidのこのCRT関数が適切に宣言されます。

この[DllImport]宣言は、間違っているという理由だけでなく、プログラムに古いVS2002 CRT(msvcr70.dll)への依存関係を与えるために削除する必要があります。これを、実際に_fpreset()を呼び出すソースコードファイルに追加します。

 #include <float.h>

マネージコードで_fpreset()を呼び出すのはかなり難しいですが、FPU制御ワードを台無しにするネイティブコードを呼び出す場合にのみ行ってください。

于 2013-01-28T19:49:03.070 に答える