gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:58:18 26 4
gpt4 key购买 nike

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

我的工作主要围绕供应商提供的以 MSVC 为中心的 API。它由 3 个头文件和几个库组成。我能够在 C++Builder 中不加改动地使用它们的 header ,但在使用 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

这会产生一大堆“expected initializer before”错误。

通过像这样重新定义前 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*));

我真的很想在不编辑它们的情况下使用这些 header ,而且我看到一些引用资料表明正确选择 gcc 发行版可能会支持这种语法,但我已经尝试了一些但没有成功。我已经尝试了 MinGW-w64 的 i686 和 x86-64 变体以及 Nuwen 和 TDM。我不关心跨平台问题,因为无论如何主机应用程序只是 Windows,并且出于我自己顽固的原因,我不想放弃并切换到 MSVC。

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

干杯

最佳答案

作为解决方法,您可以扩展您的宏定义集以涵盖 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 不可移植的特性编写代码时,将它们隐藏在宏后面。)

关于c++ - 哪个 gcc 发行版支持 __declspec(dllexport) _cdecl 和 _stdcall,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35207170/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com