gpt4 book ai didi

c++ - mingw 编译错误 : invalid conversion from 'FARPROC ' to 'void*' , 但 msvc 编译正常

转载 作者:太空宇宙 更新时间:2023-11-04 12:01:24 27 4
gpt4 key购买 nike

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

最佳答案

Why isn't this a problem under MSVC but it is under MinGW?

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

Is doing the cast like this appropriate for fixing this problem? Any side-effects I have to worry about?

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

关于c++ - mingw 编译错误 : invalid conversion from 'FARPROC ' to 'void*' , 但 msvc 编译正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13958081/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com