哪个gcc发行版支持__declspec(dllexport)_cdecl和_stdcall

我正在尝试使用mingw(MinGW-w64)和Eclipse在C ++ Builder中工作很长一段时间。 我很困惑。

我的工作主要围绕着供应商提供的以MSVC为中心的API。 它由3个头文件和几个库组成。 我能够在C ++ Builder中使用它们的头文件,但是运行了很多g ++的问题。

#define GX_WRAPPER_FUNC __declspec(dllexport) #define GX_STANDARD_FUNC #define GX_WRAPPER_CALL _cdecl #define GX_STANDARD_CALL _stdcall #define GX_OBJECT_PTR void* #define GX_VAR #define GX_CONST const #define GX_VOID void #define GX_LONG long #define GX_DOUBLE double #define GX_HANDLE long #define GX_LONG_PTR long* #define GX_DOUBLE_PTR double* #define GX_HANDLE_PTR long* #define GX_ASTR_PTR char* #define GX_WSTR_PTR wchar_t* #if defined(GEO_UTF8) #define GX_STR_PTR GX_ASTR_PTR #elif defined( _UNICODE) #define GX_STR_PTR GX_WSTR_PTR #else #define GX_STR_PTR GX_ASTR_PTR #endif #endif #ifdef __cplusplus extern "C" { #endif /*---------------- Copy_3DN[_public] ----------------*/ GX_WRAPPER_FUNC GX_LONG GX_WRAPPER_CALL Copy_3DN(GX_VAR GX_OBJECT_PTR, GX_CONST GX_HANDLE_PTR, GX_CONST GX_HANDLE_PTR); GX_STANDARD_FUNC GX_LONG GX_STANDARD_CALL Std_Copy_3DN(GX_VAR GX_OBJECT_PTR, GX_CONST GX_HANDLE_PTR, GX_CONST GX_HANDLE_PTR); ...hundreds more like this 

这产生了一大堆“预期的初始化器”之前的错误。

通过重新定义前4个定义,我取得了一些成功:

 #ifdef __GNUC__ #define GX_WRAPPER_FUNC __attribute__ ((dllexport)) #define GX_STANDARD_FUNC #define GX_WRAPPER_CALL #define GX_STANDARD_CALL #else #define GX_WRAPPER_FUNC __declspec(dllexport) #define GX_STANDARD_FUNC #define GX_WRAPPER_CALL _cdecl #define GX_STANDARD_CALL _stdcall #endif 

但是当它遇到后,它会再次出现

 GX_WRAPPER_FUNC GX_LONG GX_WRAPPER_CALL RegisterResourceTracking_GEO(GX_VAR GX_OBJECT_PTR, GX_CONST GX_LONG_PTR, GX_OBJECT_PTR, void (_stdcall *param3)(void*)); 

我真的很想使用这些标题没有编辑他们,我已经看到一些参考,build议正确的selectgcc发行版可能支持这种语法,但我已经尝试了一个数字已经没有运气。 我已经尝试了MinGW-w64和Nuwen和TDM的i686和x86-64变种。 我不关心跨平台的问题,因为主机应用程序只有Windows,而且对于我自己顽固的原因,我不想放弃并切换到MSVC。

那么,是否有一个gcc发行版来支持这个语法呢? 如果不是,阻力最小的path是什么?

干杯

作为一种解决方法,您可以扩展一组宏定义以覆盖gcc无法识别的关键字:

 #ifdef __GNUC__ #define _cdecl __attribute__((cdecl)) #define __cdecl __attribute__((cdecl)) #define _stdcall __attribute__((stdcall)) #define __stdcall __attribute__((stdcall)) #define GX_WRAPPER_FUNC __attribute__ ((dllexport)) #else #define GX_WRAPPER_FUNC __declspec(dllexport) #endif 

作为奖励,这些原始定义在这里工作:

 #define GX_STANDARD_FUNC #define GX_WRAPPER_CALL _cdecl #define GX_STANDARD_CALL _stdcall 

(FWIW,请注意,这是可能的,因为大多数MSVC扩展都是新的简单关键字,从标识符保留到实现的空间,gcc的multi-token __attribute__(())魔术使反向映射完全不可能。使用gcc非便携式功能编写代码,将它们隐藏在宏之后。)