Delphi 互換性マクロ

提供: RAD Studio
移動先: 案内検索

プリプロセッサ:インデックス への移動


ここで説明されている 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