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

时间:2012-12-19 17:44:25

标签: c++ winapi visual-c++ mingw

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

1 个答案:

答案 0 :(得分:1)

  

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

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

  

这样做的演员是否适合解决这个问题?我不得不担心任何副作用吗?

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