海湾合作委员会中的博兰德风格__closure
Borland style __closure in gcc
我是使用 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
最大的问题是"我怎样才能使GCC(MinGW 4.71,我也有4.92)来理解表达式typedef void __cdecl (__closure *JFXC)();
?
不带 __closure
的表达式按预期编译和工作。
替换__closure
在我看来,这些博兰德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();
我已经解决了我的部分问题。JFXC函数类型用于将对象方法作为指针进行操作(不用于调用方法),其余的由库(汇编器)函数完成。使用 gcc,我无法将任何成员函数分配或类型转换为通用对象::方法类型。以下定义使之成为可能,但在尝试调用时仍然存在问题,但在我这边,由于 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
感谢大家回复该帖子。
- Qt VTK交互风格的信号到小部件
- 我可以使用条件运算符初始化C风格的字符串文字吗
- Visual Studio 2019:插入多个C++风格的单行注释
- 如何在本地机器上运行c++和javascript客户端代码(hackerbank风格)
- 重载运算符<<采用谷歌 C++ 风格
- C++许多 SFINAE 风格的过载
- 谷歌风格指南(前向分枝部分)
- 如何使用 cmake pack redhat 风格的 rpm,这是主要的和"-devel"?
- 如何用符合C++核心准则的代码替换C风格的字符串解析
- 如何编写一个类似于kernellist_head的c++风格的双链表实现
- 用现代C++STL数据结构替换旧的C风格数组
- 如何确保 C/C++ 代码中不会缺少 doxygen 风格的文档注释?
- C++(Visual Studio)有Java风格的注释吗?
- 如何"Re-Polish"相同风格的QApplication?
- 如何按照 Google C++风格指南连接字符串文字?
- 如何为特定的构建风格设置 cpp 文件夹
- 使用 rangesv3 在 c++ 中模拟 python 风格的列表理解?
- 包括C++标题,"..."与<...>风格,ISO / IEC官方意见?
- 为什么一个简单的"Hello World"风格的程序不能用Turbo C++编译?
- 我如何使用MFC C 模仿办公风格