我试图在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发行版?如果不是,阻力最小的路径是什么?
欢呼声
答案 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非便携式功能编写代码时,请将它们隐藏在宏后面。)