Macros de compatibilité Delphi

De RAD Studio
Aller à : navigation, rechercher

Remonter à Le préprocesseur - Index


Les cinq macros décrites ici sont utilisées pour la compatibilité entre le code Delphi et le code C++, généralement lors de la génération des fichiers .hpp pour du code écrit en Delphi. Ces macros peuvent être trouvées dans include\windows\rtl\sysopen.h.

Considérons l'exemple suivant d'une procédure Delphi :

procedure myProc(a: array of Integer);

Dans ce cas, a est appelé un tableau ouvert car vous pouvez lui transmettre tous les types de tableaux dynamiques entiers. Tous les types de tableaux statiques entiers sont transmissibles (ou passables). Cela peut se produire car le compilateur considère la procédure comme étant comme suit :

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

a est un pointeur sur le premier élément du tableau passé et a_size est le nombre d'éléments.

Cette technique est utilisée lors de la génération des fichiers .hpp C++ pour un source Delphi :

void myProc(int* a, int a_size)

L'extrait de code ci-dessus est la définition de la procédure C++ dans ce cas.

OPENARRAY

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

La macro OPENARRAY peut être utilisée comme dans l'exemple suivant :

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.

La même technique est utilisée pour le reste des macros.

ARRAYOFCONST

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

La macro ARRAYOFCONST peut être utilisée comme dans l'exemple suivant :

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

Pour EXISTINGARRAY, le paramètre a est un tableau existant où un tableau ouvert est attendu.

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

SLICE

Pour SLICE, a est une partie d'un tableau existant où un tableau ouvert est attendu.

#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