1

我正在尝试将一个开源项目移植到 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

4

1 回答 1

1

为什么这在 MSVC 下不是问题,但在 MinGW 下?

Visual C++ 有一个“扩展”,它允许从指向函数的指针隐式转换为void*. 这种转换不是 C++ 语言的一部分。

像这样进行演员表适合解决这个问题吗?有什么我需要担心的副作用吗?

在 Windows 上,指向非成员函数的指针和指向对象的指针大小相同,在这里使用强制转换没有问题。实际上,所有使用的代码GetProcAddress都需要在某个时候强制转换返回的指针,以将其转换为正确的函数指针类型,以便在调用表达式中使用。

于 2012-12-19T20:43:53.740 回答