Delphi 互換性マクロ
プリプロセッサ:インデックス への移動
ここで説明されている 5 つのマクロは、Delphi と C++ のコード間の互換性を保つためのもので、通常は、Delphi で記述されたコードの .hpp ファイルを生成する際に使用されます。これらのマクロは include\windows\rtl\sysopen.h
に定義されています。
目次
次の Delphi 手続きの例を見てみましょう。
procedure myProc(a: array of Integer);
この場合、a
には任意の型の整数の動的配列を渡すことができるため、これはオープン配列と呼ばれます。任意の型の整数の静的配列を渡すことができます。これは、コンパイラがこの手続きを次のようなものと見なすからです。
procedure myProc(a: ^Integer; a_size: Integer);
ここで、a
は渡された配列の先頭要素を指すポインタであり、a_size
は要素数です。
この手法は Delphi ソースの C++ .hpp ファイルを生成するときに使用されます。
void myProc(int* a, int a_size)
上記のコードは、この場合の C++ 手続きの定義です。
OPENARRAY
#define OPENARRAY(type, values) \ OpenArray<type>values, OpenArrayCount<type>values.GetHigh()
OPENARRAY マクロは、次の例のように使用することができます。
myProc(OPENARRAY(TVarRec,(1, 2, 3, 4, 5))) //in which case the expanded code looks like: myProc(OpenArray<TVarRec>(1, 2, 3, 4, 5), OpenArrayCount<TVarRec>(1, 2, 3, 4, 5).GetHigh()) //which corresponds to what Delphi methods expect.
残りのマクロにも、これと同じ手法が用いられています。
ARRAYOFCONST
#define ARRAYOFCONST(values) \ OpenArray<TVarRec>values, OpenArrayCount<TVarRec>values.GetHigh()
ARRAYOFCONST マクロは、次の例のように使用することができます。
myProc(ARRAYOFCONST((1, 2, 3, 4, 5))) //in which case the expanded code looks like: myProc(OpenArray<TVarRec>(1, 2, 3, 4, 5), OpenArrayCount<TVarRec>(1, 2, 3, 4, 5).GetHigh()) //which corresponds to what Delphi methods expect.
ARRAYSIZE
#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
EXISTINGARRAY
EXISTINGARRAY の場合、a
パラメータは既存の配列で、そこではオープン配列が想定されています。
#define EXISTINGARRAY(a) (a), ((sizeof(a)/sizeof(a[0]))-1)
SLICE
SLICE の場合、a は、オープン配列が想定されている既存の配列の一部です。
#define SLICE(a, n) (a), (n - 1)
VCL_MESSAGE_HANDLER
#define VCL_MESSAGE_HANDLER(msg,type,meth) \ case msg: \ meth(*((type *)Message)); \ break;
__interface
#define __interface struct