Object Pascal-Kompatibilitätsmakros

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Der Präprozessor - Index


Die fünf hier beschriebenen Makros werden für die Kompatibilität von Object Pascal- und C++-Code, in der Regel beim Erzeugen von .hpp-Dateien für in Object Pascal geschriebenen Quelltext, verwendet. Diese Makros befinden sich in include\windows\rtl\sysopen.h.

Sehen Sie sich das folgende Beispiel einer Object Pascal-Prozedur an:

procedure myProc(a: array of Integer);

a ist hier ein offenes Array, weil Sie einen beliebigen Typ eines ganzzahligen dynamischen Arrays übergeben können. Es kann auch jeder Typ eines ganzzahligen statischen Arrays übergeben werden. Dies ist möglich, weil der Compiler die Prozedur folgendermaßen betrachtet:

procedure myProc(a: ^Integer; a_size: Integer);

wobei a ein Zeiger auf das erste Element des übergebenen Arrays und a_size die Anzahl der Elemente ist.

Mit dieser Technik werden die C++-.hpp-Dateien für eine Object Pascal-Quelldatei erzeugt:

void myProc(int* a, int a_size)

Das obige Codefragment ist in diesem Fall die Definition der C++-Prozedur.

OPENARRAY

#define OPENARRAY(type, values) \
   OpenArray<type>values, OpenArrayCount<type>values.GetHigh()

Das Makro OPENARRAY kann wie in dem folgenden Beispiel verwendet werden:

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 Object Pascal methods expect.

Für die restlichen Makros wird dieselbe Technik verwendet.

ARRAYOFCONST

#define ARRAYOFCONST(values) \
   OpenArray<TVarRec>values, OpenArrayCount<TVarRec>values.GetHigh()

Das Makro ARRAYOFCONST kann wie in dem folgenden Beispiel verwendet werden:

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 Object Pascal methods expect.

ARRAYSIZE

#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))

EXISTINGARRAY

Bei EXISTINGARRAY ist der Parameter a ein vorhandenes Array, wenn ein offenes Array erwartet wird.

#define EXISTINGARRAY(a) (a), ((sizeof(a)/sizeof(a[0]))-1)

SLICE

Bei SLICE ist a ein Teil eines vorhandenen Arrays, wenn ein offenes Array erwartet wird.

#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