オープンソースプロジェクトを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