gcc中的Borland样式__closure

时间:2015-01-04 19:23:35

标签: c++ gcc closures borland-c++

我是使用gnu C ++编程的新手。我有一个应用程序,我认为将转换为跨平台,我开始使用C :: B大约两个月前。我遇到了很多问题,但我解决了它们在#ifdef BCB ... #else ... #endif块中保留原始代码以保留对象类或结构。我无法解决以下问题,因为它非常复杂。自1997/1998年以来,函数声明一直在起作用,并且依赖于这些定义和实现开发了应用程序的每个点。它们用于对象间,进程间和网络通信以及所有交互式事件系统。任何地方的任何函数都可以直接调用任意数量(最多50个)参数,或者通过流连接调用,只要我们的JetRtl.dll准备好服务并且调用者知道参数的数量。我解释了这么久,因为据我所知,很多人只是问......为什么......"或者给幼稚的解决方案只能在" Hello World"应用。

这是头文件。最近添加了#else .... #endif部分。

#ifndef fcalls_h
#define fcalls_h

#include <jettip.h>
#include <stdarg.h>

//  CM_FN_.. calls non member F(...), (ecx & 4) == 0
#define CM_FN_C 0x8FF0 // __cdecl non member F(...)
#define CM_FN_F 0x8FF1 // __fastcall non member F(...)
#define CM_FN_P 0x8FF2 // __pascal non member F(...)
#define CM_FN_S 0x8FF3 // __stdcall non member F(...)

//  CM_FNX.. calls  member X::F(...), (ecx & 4) == 4
#define CM_FNXC 0x8FF4 // __cdecl member X::F(...)
#define CM_FNXF 0x8FF5 // __fastcall member X::F(...)
#define CM_FNXP 0x8FF6 // __pascal member X::F(...)
#define CM_FNXS 0x8FF7 // __stdcall member X::F(...)

#define CM_TERK 0xFFFE // Quits message loop
#define CM_DELW 0x8FFF // destroy link window

typedef void __cdecl    (*JF_C)();
#ifdef BCB
typedef void __cdecl    (__closure *JFXC)();
#else
template<class T> class FXT{};
template<class R> class FXT<R()>{};
template<class R,class A> class FXT<R(A)>{};
template<class R,class A,class B> class FXT<R(A,B)>{};
template<class R,class A,class B,class C> class FXT<R(A,B,C)>{};
template<class R,class A,class B,class C,class D> class FXT<R(A,B,C,D)>{};
template<class R,class A,class B,class C,class D, class E> class FXT<R(A,B,C,D,E)>{};
template<class R,class A,class B,class C,class D, class E,class F> class FXT<R(A,B,C,D,E,F)>{};
template<class R,class A,class B,class C,class D, class E,class F,class G> class    FXT<R(A,B,C,D,E,F,G)>{};

typedef FXT<void __cdecl (void*)> JFXC;
#endif

JF_C __cdecl F_CP(...);
JFXC __cdecl FXCP(...);
JF_C __cdecl _F_CP(int yer, ...);
JFXC __cdecl _FXCP(int yer, ...);

long __fastcall RunFN_C(va_list list, long args);
long __fastcall RunFN_F(va_list list, long args);
long __fastcall RunFN_P(va_list list, long args);
long __fastcall RunFN_S(va_list list, long args);

long __fastcall RunFNXC(va_list list, long args);
long __fastcall RunFNXF(va_list list, long args);
long __fastcall RunFNXP(va_list list, long args);
long __fastcall RunFNXS(va_list list, long args);

// Dispatches the function call into appropirate function; fnx(list, args)
long  __fastcall JetTip DispCall(va_list list, long args, int call);

#endif

最重要的问题是&#34;我如何制作GCC(MinGW 4.71,我还有4.92)来理解表达式typedef void __cdecl (__closure *JFXC)();?&#34;

没有__closure的表达式编译并按预期工作。

2 个答案:

答案 0 :(得分:5)

__closure

的替换

在我看来,这些Borland C ++ ......

struct S { void f(){} };
S s;
typedef void __cdecl (__closure *JFXC)();
JFXC jfxc (&(s.f));
jfxc();

...可以用C ++ 11的这些位替换

struct S { void f(){} };
S s;
typedef std::function<void()> JFXC;
JFXC jfxc (std::bind (&S::f, &s));
jfxc();

答案 1 :(得分:0)

我已经解决了我的部分问题。 JFXC函数类型用于将对象方法作为指针(不是用于调用方法)来操作,其余的由库(汇编程序)函数完成。使用gcc,我无法将任何成员函数赋值或类型转换为泛型object :: method类型。以下定义使其成为可能,但在尝试调用时仍然存在问题,但由于FNXC类型由手动设计/修改的汇编模块处理,因此编译时没有问题。对我来说唯一的问题是我希望gcc为目标平台和架构生成汇编代码。以上代码的以下更改在任何情况下都会编译。您可以取消注释#ifndef __closure部分。

typedef void __cdecl    (*JF_C)();

#ifdef BCB
typedef void __cdecl    (__closure *JFXC)();
#else
class ANY;
/*#ifndef __closure
#   define __closure ANY::
#endif*/
#ifdef __closure
typedef void __cdecl    (__closure *JFXC)();
#else
typedef void __cdecl (*JFXC)(ANY&, void (ANY::*)());
#endif

#endif // BCB

感谢所有回复帖子的人。