Die Schlüsselwort-Erweiterung __declspec

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Sprachunterstützung für die Appmethod-Bibliotheken (C++)


Einige Argumente des Schlüsselworts __declspec stellen die Sprachunterstützung für die Bibliotheken bereit. Diese Argumente sind im Folgenden aufgeführt. Makros für die declspec-Argumente und Kombinationen davon sind in sysmac.h definiert. In den meisten Fällen müssen Sie diese nicht angeben. Wenn Sie sie hinzufügen müssen, sollten Sie die Makros verwenden.

__declspec(delphiclass)

Mit dem Argument delphiclass werden von TObject abgeleitete Klassen deklariert. Diese Klassen werden mit der folgenden Kompatibilität erstellt:

  • Object Pascal-kompatible RTTI
  • Bibliothekskompatibles Konstruktor-/Destruktor-Verhalten
  • Bibliothekskompatible Exception-Behandlung

Für bibliothekskompatible Klassen gelten die folgenden Einschränkungen:

  • Virtuelle Basisklassen sind nicht zulässig.
  • Mehrfachvererbung ist nicht zulässig, außer für den unter Vererbung und Interfaces beschriebenen Fall.
  • Müssen dynamisch mit dem globalen Operator new erzeugt werden.

    Hinweis: Wenn eine Instanz statisch zugewiesen ist (z.B. als lokale Variable), ignoriert der Compiler ohne Warnung die Direktive declspec.

  • Ein Destruktor muss vorhanden sein.
  • Kopierkonstruktoren und Zuweisungsoperatoren werden für von der Bibliothek abgeleitete Klassen nicht vom Compiler erzeugt.
  • Eine aus Object Pascal übersetzte Klassendeklaration benötigt diesen Modifizierer, wenn dem Compiler mitgeteilt werden muss, dass die Klasse von TObject abgeleitet ist.

__declspec(delphirecord)

Das Speicherklassenattribut delphirecord wird beim Konvertieren von Object Pascal-Records in C++-Klassen/Strukturen in .hpp-Headern (mit dem Object Pascal-Compiler) verwendet. In Object Pascal gibt es die Konvention bezüglich von Funktionen zurückgegebenen Records, dass eine solche Funktion einen verborgenen Parameter zurückgibt, der auf den zurückzugebenden Record zeigt. Object Pascal gibt einen Zeiger auf eine Position zurück, die mit 0 initialisiert ist; in C++ gibt es eine derartige Garantie nicht. Wenn C++ eine von einer Funktion zurückgegebene und als __declspec(delphirecord) gekennzeichnete Struktur findet, füllt es aus Übereinstimmungsgründen die Speicherposition mit Nullen auf.

__declspec(delphireturn)

Das Argument delphireturn dient nur dem internen Gebrauch durch die Bibliotheken in Appmethod C++. Damit werden Klassen deklariert, die in Appmethod C++ zur Unterstützung der in Object Pascal integrierten Datentypen und Sprachkonstrukte erstellt wurden, weil es dafür keinen nativen C++-Typ gibt. Dazu zählen die Datentypen Currency, UnicodeString, AnsiString, Variant, TDateTime und Set. Mit dem Argument delphireturn werden C++-Klassen für die bibliothekskompatible Behandlung in Funktionsaufrufen als Parameter und Rückgabewerte gekennzeichnet. Dieser Modifizierer ist erforderlich, wenn eine Struktur per Wert an eine Funktion von Object Pascal an C++ (und umgekehrt) übergeben wird.

__declspec(delphirtti)

Das Argument delphirtti veranlasst den Compiler, die Laufzeittypinformationen beim Compilieren in eine Klasse einzubeziehen. Wenn dieser Modifizierer angegeben ist, erzeugt der Compiler Laufzeittypinformationen für alle Felder, Methoden und Eigenschaften, die in einem published-Abschnitt deklariert sind. Bei Interfaces erzeugt der Compiler Laufzeittypinformationen für alle Methoden des Interface. Wenn eine Klasse mit Laufzeittypinformationen compiliert wird, enthalten auch alle davon abgeleiteten Klassen Laufzeittypinformationen. Weil die Klasse TPersistent mit Laufzeittypinformationen compiliert wird, brauchen Sie daher diesen Modifizierer nicht für Klassen zu verwenden, deren Vorfahre TPersistent ist. Dieser Modifizierer wird hauptsächlich für Interfaces in Anwendungen eingesetzt, die Webdienste implementieren oder verwenden.

__declspec(dynamic)

Mit dem Argument dynamic werden dynamische Funktionen deklariert. Dynamische Funktionen entsprechen virtuellen Funktionen, außer dass sie nur in den V-Tabellen für das Objekt, das sie definiert, gespeichert sind und nicht in den V-Tabellen von Nachkommen. Wenn Sie eine dynamische Funktion aufrufen, und diese Funktion nicht in Ihrem Objekt definiert ist, werden die V-Tabellen der Vorfahrobjekte durchsucht, bis die Funktion gefunden wird. Dynamische Funktionen sind nur für von TObject abgeleitete Klassen gültig.

__declspec(hidesbase)

Das Argument hidesbase behält beim Portieren von virtuellen und überschriebenen Funktionen aus Object Pascal nach Appmethod C++ die Object Pascal-Programmsemantik bei. In Object Pascal kann eine virtuelle Funktion aus einer Basisklasse in einer abgeleiteten Klasse als Funktion mit demselben Namen erscheinen, die aber als vollständig neue Funktion ohne explizite Beziehung zu der ersten dienen soll.

Die Compiler verwenden das in sysmac.h definierte Makro HIDESBASE, um anzugeben, dass Funktionsdeklarationstypen vollständig selbständig sind. Wenn beispielsweise eine Basisklasse T1 eine virtuelle Funktion func deklariert, die keine Argumente übernimmt, und die abgeleitete Klasse T2 eine Funktion mit demselben Namen und derselben Signatur deklariert, würde der Object Pascal-Compiler eine HPP-Datei mit dem folgenden Prototyp produzieren:

    virtual void T1::func(void) ;
    HIDESBASE void T2::func(void) ;

Ohne die HIDESBASE-Deklaration würde das in der C++-Programmsemantik bedeuten, dass die virtuelle Funktion T1::func() von T2::func() überschrieben wird.

__declspec(package)

Das Argument package gibt an, dass der Quelltext, der die Klasse definiert, in ein Package compiliert werden kann. Dieser Modifizierer wird vom Compiler beim Erstellen von Packages in der IDE automatisch erzeugt.

__declspec(pascalimplementation)

Das Argument pascalimplementation gibt an, dass der Quelltext, der die Klasse definiert, in Object Pascal implementiert wurde. Dieser Modifizierer erscheint in einer Object Pascal-Portabilitäts-Header-Datei mit der Dateierweiterung .hpp.

__declspec(uuid)

Das Argument uuid ordnet einer Klasse einen global eindeutigen Bezeichner (GUID) zu. Dieser Modifizierer kann für alle Klassen verwendet werden, wird aber in der Regel für Klassen eingesetzt, die Object Pascal-Interfaces (oder COM-Interfaces) repräsentieren. Sie können den GUID einer Klasse ermitteln, die mit diesem Modifizierer deklariert wurde, indem Sie die Direktive __uuidof aufrufen.

Siehe auch