2016-02-04 61 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非便攜式功能編寫代碼,將它們隱藏在宏後面。)

相關問題