#pragma exit und #pragma startup

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Pragma-Direktiven (Übersicht) - Index


Syntax (siehe Pseudogrammatik)

#pragma startup FUNC [NN]
#pragma exit FUNC [NN]

Beschreibung

Mit diesen beiden Pragma-Direktiven können im Programm Funktionen angegeben werden, die beim Programmstart (vor dem Aufruf von main) bzw. beim Programmende (unmittelbar, bevor die Funktion _exit ausgeführt wird) aufgerufen werden sollen.

Der angegebene Funktionsname muss eine bereits deklarierte Funktion sein, die keine Argumente übernimmt und ein Ergebnis vom Typ void zurückliefert. Sie muss also folgendermaßen deklariert werden:

void myfunc(void);

Dann wäre #pragma:

#pragma startup myfunc

Festlegen der Priorität

Der optionale Prioritätsparameter (NN) muss eine Ganzzahl im Bereich von 64 bis 255 sein:

  • Die höchste Priorität ist 0.
  • Funktionen mit höheren Prioritäten werden beim Start zuerst und beim Ende zuletzt aufgerufen.
  • Wenn Sie keine Priorität festlegen, wird als Standardpriorität für BCC32 und C++-Compiler, die durch Clang erweitert wurden, 100 verwendet.

Warnung: Verwenden Sie für BCC32 keine Prioritätswerte, die kleiner als 64 sind. Prioritäten von 0 bis 63 sind für die RTL-Start- und -Beendigungsmechanismen reserviert. Eine Ausnahme für C++-Compiler, die durch Clang erweitert wurden, ist weiter unten in diesem Text beschrieben.

Reihenfolge der Unit-Initialisierung in mit C++-Compilern, die durch Clang erweitert wurden, erstellten Anwendungen

Hinweis: Die Reihenfolge der Unit-Initialisierung sollte Vorrang vor der #pragma startup-Reihenfolge haben, das ist aber gegenwärtig für C++-Compiler, die durch Clang erweitert wurden, nicht implementiert.

Durch Clang erweiterte C++-Compiler verwenden die Unit-Initialisierungsreihenfolge nicht, und deshalb werden exit-Routinen, die ohne Priotitätsangabe ausgeführt werden, geschlossen, bevor das Hauptformular geschlossen wird. Bei C++-Compilern, die durch Clang erweitert wurden, müssen Sie die #pragma exit-Routine mit einer Priorität von 30 angeben, damit sichergestellt ist, dass die exit-Routine nach __ExitVCL ausgeführt wird (und mit dem Verhalten von BCC32 übereinstimmt). Zum Beispiel:

 #pragma exit myfunc 30

Siehe auch