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

时间:2016-02-04 17:05:44

标签: c++ windows gcc

我试图在C ++ Builder中工作很长时间后开始使用mingw(MinGW-w64)和eclipse。我很困惑。

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

我真的想在没有编辑它们的情况下使用这些标题,我看到一些参考文献表明正确选择gcc发行版可能会支持这种语法,但我已经尝试了一个没有运气的数字。我已经尝试了MinGW-w64和Nuwen和TDM的i686和x86-64变体。我不关心跨平台问题,因为主机应用程序只是Windows,而且出于我自己的顽固原因,我不想放弃并切换到MSVC。

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

欢呼声

1 个答案:

答案 0 :(得分: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

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

#define GX_STANDARD_FUNC
#define GX_WRAPPER_CALL  _cdecl
#define GX_STANDARD_CALL _stdcall

(FWIW,请注意这是可能的,因为大多数MSVC扩展都是新的简单关键字,从保留给实现的标识符空间开始.gcc的多标记__attribute__(())魔法使得反向映射完全不可能。所以每次使用gcc非便携式功能编写代码时,请将它们隐藏在宏后面。)