2016-02-04 26 views
1

我想在C++ Builder中长时间工作后开始使用mingw(MinGW-w64)和eclipse。我很困惑。哪个gcc发行版支持__declspec(dllexport)_cdecl和_stdcall

我的工作主要围绕供应商提供的以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 

但遇到当后来barfs

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*)); 

我真的想使用这些头,不编辑它们,我已经看到一些提示,指出gcc发行版的正确选择可能支持这种语法,但我已经尝试了一些数字,但没有运气。我已经尝试了MinGW-w64和Nuwen和TDM的i686和x86-64变体。我并不关心跨平台问题,因为主机应用程序只有Windows,并且由于我自己固执的原因,我不想放弃并切换到MSVC。

那么,有没有gcc发行版支持这种语法?否则,阻力最小的路径是什么?

欢呼

+0

您是否尝试过#define __stdcall __attribute __((stdcall))? –

+0

单下划线版本失败了,使用两个。所以__stdcall而不是_stdcall。 –

+0

@BenVoigt工作。你可以把它作为答案发布,以便我可以接受它吗? – marcp

回答

4

作为一种变通方法,您可以扩展您的宏定义覆盖关键字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 

作为奖励,让那些原来的定义在这里工作: (FWIW,请注意,这是可能的,因为大多数MSVC扩展是新的简单关键字,从标识符保留到实现的空间。 gcc的多标记__attribute__(())魔法使反向映射完全不可能。因此,无论何时您使用gcc非便携式功能编写代码,将它们隐藏在宏后面。)

相关问题