mingw 编译错误:从 'FARPROC ' 到 'void*' 的转换无效,但 msvc 编译正常
mingw compile error: invalid conversion from 'FARPROC ' to 'void*', but msvc compiles fine
我正在尝试将开源项目移植到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
的所有代码无论如何都需要在某个时候投射返回的指针,以将其转换为正确的函数指针类型以用于呼叫表达式。
相关文章:
- is_same和variadic模板编译时错误无效转换
- C++ SPDLOG 编译错误:变量或字段"set_error_handler"声明为无效
- 编译native_app_glue.c会导致库文件无效
- 数组下标编译的无效类型'int[int]'由于 -Wfatal 错误而终止
- 加密注释C++具有无效操作数的编译错误
- 编译项目时文件无效或损坏,包括 V8
- 常量正确性编译错误到模板函数中的无效转换错误
- 从"常量字符*"到"字符*"[-允许]的转换无效;VTK-7.1.1 编译错误
- 即使我传递了无效的类型参数,我为什么还能在没有错误的情况下编译此代码
- 当使用无效表达式时,概念是否应该无法编译?
- mingw 编译错误:从 'FARPROC ' 到 'void*' 的转换无效,但 msvc 编译正常
- C++代码编译失败,错误"长类型名称"无效
- 使用 VS2012 编译库时符号名称无效
- "N"的模板参数无效,预期的编译时常量表达式
- 编译C++代码时出错(转换无效)
- std::enable_if 未编译(模板参数无效)
- C2975 "N"的模板参数无效,预期的编译时常量表达式
- 隐式模板参数无效,但仍可以编译
- 无法编译C++代码:从'Node*'到'int'的转换无效
- 编译错误 - 数组下标'char[int]'的类型无效