我正在尝试将一个开源项目移植到 mingw。我在一个在 msvc 下编译良好的源文件中遇到了一个奇怪的转换错误。
这是重现错误的隔离测试用例:
#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 下?
- 像这样进行演员表适合解决这个问题吗?有什么我需要担心的副作用吗?
- 有替代方案吗?移植这样的代码时有什么建议?
我目前正在使用 Mingw 4.7.2 构建它,但我也尝试过类似错误的早期版本,如 4.7.1 和 4.5.2。
对于那些好奇的人,这里是实际的源文件:发生这种情况的存储库中的行:https ://github.com/OpenImageIO/oiio/blob/master/src/libutil/plugin.cpp#L96