1

オープンソースプロジェクトをmingwに移植しようとしています。msvcの下で正常にコンパイルされるソースファイルの1つで奇妙な変換エラーが発生します。

エラーを再現する分離されたテストケースは次のとおりです。

#include <windows.h>

void * test(HMODULE h, const char *name)
{
    return GetProcAddress(h, name);
}

int main() {}

そして、mingwでコンパイルするときの対応するエラー出力:

g++.exe -Wall  -g  -pedantic -Wall   -IG:\OSS\blender-dev\lib\mingw32\opencolorio\include  -c G:\OSS\compile_test\main.cpp -o Debug\main.o
G:\OSS\compile_test\main.cpp: In function 'void* test(HMODULE, const char*)':
G:\OSS\compile_test\main.cpp:45:34: error: invalid conversion from 'FARPROC {aka int (__attribute__((__stdcall__)) *)()}' to 'void*' [-fpermissive]

もちろん、このコンパイルエラーをプッシュする簡単な方法は、明示的なキャストを行うことです。

return (void *)GetProcAddress(h, name);

しかし、それを行う前に、私は次のことを知る必要があります。

  • これはMSVCでは問題にならないのに、Mingwでは問題になるのはなぜですか?
  • この問題を解決するには、このようなキャストを行うのが適切ですか?私が心配しなければならない副作用はありますか?
  • 代替手段はありますか?このようなコードを移植するときに推奨されることは何ですか?

私は現在Mingw4.7.2でこれを構築していますが、4.7.1や4.5.2などの以前のバージョンも同様のエラーで試しました。

興味のある人のために、これが起こっているリポジトリの実際のソースファイル:行があります:https ://github.com/OpenImageIO/oiio/blob/master/src/libutil/plugin.cpp#L96

4

1 に答える 1

1

これはMSVCでは問題にならないのに、MinGWでは問題になるのはなぜですか?

Visual C ++には、ポインタから関数への暗黙の変換を可能にする「拡張機能」がありますvoid*。この変換はC++言語の一部ではありません。

この問題を解決するには、このようなキャストを行うのが適切ですか?私が心配しなければならない副作用はありますか?

非メンバー関数へのポインターとオブジェクトへのポインターが同じサイズであるWindowsでは、ここでキャストを使用しても問題はありません。実際には、を使用するすべてのコードGetProcAddressは、呼び出し式で使用するために正しい関数ポインター型に変換するために、とにかくある時点で返されたポインターをキャストする必要があります。

于 2012-12-19T20:43:53.740 に答える