mingw 编译错误:从 'FARPROC ' 到 'void*' 的转换无效,但 msvc 编译正常

mingw compile error: invalid conversion from 'FARPROC ' to 'void*', but msvc compiles fine

本文关键字:编译 无效 转换 msvc 错误 FARPROC void mingw      更新时间:2023-10-16

我正在尝试将开源项目移植到mingw。我在一个源文件之一中遇到了一个奇怪的转换错误。

这是孤立的测试案例,重现了错误:

#include <windows.h>
void * test(HMODULE h, const char *name)
{
    return GetProcAddress(h, name);
}
int main() {}

和使用mingw编译时的相应错误输出:

g++.exe -Wall  -g  -pedantic -Wall   -IG:OSSblender-devlibmingw32opencolorioinclude  -c G:OSScompile_testmain.cpp -o Debugmain.o
G:OSScompile_testmain.cpp: In function 'void* test(HMODULE, const char*)':
G:OSScompile_testmain.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/oiio/blob/master/src/src/libutil/plugin/plugin.cpp#l96

为什么这不是MSVC下的问题,而是在mingw下?

Visual C 具有"扩展",该扩展允许从指针到功能到void*的隐式转换。此转换不是C 语言的一部分。

这样的演员表是否适合解决此问题?我必须担心任何副作用?

在Windows上,指向非成员函数和对象的指针相同,在此处使用铸件没有问题。实际上,使用GetProcAddress的所有代码无论如何都需要在某个时候投射返回的指针,以将其转换为正确的函数指针类型以用于呼叫表达式。