gpt4 book ai didi

c++ - gcc 中的 Borland 风格 __closure

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:34:21 25 4
gpt4 key购买 nike

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

最大的问题是“我如何让 GCC(MinGW 4.71,我也有 4.92)理解表达式 typedef void __cdecl (__closure *JFXC)();?”

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

最佳答案

替换__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();

关于c++ - gcc 中的 Borland 风格 __closure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27769401/

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