2

いくつかの API 関数を持つライブラリ (C++) があります。そのうちの 1 つは __cdecl として宣言されていますが、__stdcall から関数ポインターを取得します。何かのようなもの:

typedef  int (__stdcall *Func)(unsigned char* buffer);
//...
int ApiFunc(Func funcPtr); //This is __cdecl since it is an 'extern "C"' library and the calling convention is not specified

次に、このライブラリを使用する C++ 実行可能プロジェクトがありますが、上記の API を呼び出さないか、Func型を使用しません。

の呼び出し規約を に変更した後Func__stdcall次のコンパイル エラーが発生します。

エラー C2995: 'std::pointer_to_unary_function<_Arg,_Result,_Result(__cdecl *)(_Arg)> std::ptr_fun(_Result (__cdecl *)(_Arg))': 関数テンプレートは既に定義されています c:\program files\ Microsoft Visual Studio 8\vc\include\functional

それは何でしょうか?

前もって感謝します!!

4

2 に答える 2

2

少なくとも Windows では互換性があります (Linux では __stdcall はまったくありません...)。

#ifndef __MYLIB_WIN32
//Just an empty define for Linux compilation
#define __stdcall
#endif

exe プロジェクトにはこの定義が含まれており、__MYLIB_WIN32 は定義されておらず、ライブラリのみで定義されています。上記の定義を次のように変更します。

#ifndef WIN32
//Just an empty define for Linux compilation
#define __stdcall
#endif

すべてが正常に動作します。

皆さん、ありがとうございました。

于 2010-06-30T08:38:41.443 に答える
2

エラー..互換性がありません。呼び出しの両側で同じ呼び出し規則を指定する必要があります。そうしないと、呼び出しを試みると、マシン スタックが爆発します。

于 2010-06-29T13:50:42.690 に答える