我正在尝试将一个开源项目移植到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);
但在此之前,我需要了解以下内容:
我目前正在使用Mingw 4.7.2构建它,但我也尝试过类似4.7.1和4.5.2之类的早期版本。
对于那些好奇的人来说,这是实际的源文件:存储库中出现这种情况的行:https://github.com/OpenImageIO/oiio/blob/master/src/libutil/plugin.cpp#L96
答案 0 :(得分:1)
为什么这不是MSVC下的问题,但它是在MinGW下?
Visual C ++有一个“扩展”,允许从指向函数到void*
的隐式转换。此转换不是C ++语言的一部分。
这样做的演员是否适合解决这个问题?我不得不担心任何副作用吗?
在Windows上,指向非成员函数和指向对象的指针的大小相同,这里使用强制转换没有问题。实际上,使用GetProcAddress
的所有代码都需要在某个时刻转换返回的指针,以将其转换为正确的函数指针类型,以便在调用表达式中使用。