Handbuch zur dynamischen Ablaufverfolgung in Solaris

Inline

Benannte Konstanten in D können auch anhand von inline-Direktiven definiert werden. Dabei handelt es sich um ein allgemeineres Hilfsmittel für die Erzeugung von Namen, die bei der Kompilierung durch vordefinierte Werte oder Ausdrücke ersetzt werden. Inline-Direktiven stellen im Vergleich zu der #define-Direktive des C-Preprozessors eine leistungsfähigere lexikalische Ersetzung zur Verfügung, da der Ersetzung ein tatsächlicher Typ zugewiesen ist und sie nicht nur anhand einer Menge lexikalischer Symbole (Token), sondern unter Verwendung des kompilierten Syntaxbaums durchgeführt wird. Inline-Direktiven werden in folgender Form deklariert:

inline Typ Name = Ausdruck ;

wobei Typ eine Typdeklaration eines vorhandenen Typs ist, Name ein beliebiger gültiger D-Bezeichner, der noch nicht als Inline- oder globale Variable definiert wurde, und Ausdruck ein beliebiger gültiger D-Ausdruck. Sobald die Inline-Direktive verarbeitet ist, setzt der D-Compiler die kompilierte Form von Ausdruck für jede nachfolgende Instanz von Name im Programmquellcode ein. Das nächste D-Programm verfolgt beispielsweise die Zeichenkette "hello" und den ganzzahligen Wert 123:

inline string hello = "hello";
inline int number = 100 + 23;

BEGIN
{
	trace(hello);
	trace(number);
}

Ein Inline-Name ist überall dort zulässig, wo eine globale Variable des entsprechenden Typs verwendet werden kann. Wenn die Inline-Direktive zur Kompilierungszeit eine ganzzahlige oder eine Zeichenkettenkonstante ergibt, kann der Inline-Name auch in einem Kontext verwendet werden, in dem konstante Ausdrücke wie zum Beispiel skalare Vektordimensionen erforderlich sind.

Zur Auswertung der Anweisung gehört die Prüfung der Inline-Direktive auf Syntaxfehler. Der Ergebnistyp des Ausdrucks muss mit dem in der Inline-Direktive definierten Typ vereinbar sein. Hierbei gelten dieselben Regeln wie für den D-Zuweisungsoperator (=). Ein Inline-Ausdruck darf nicht auf den Inline-Namen selbst verweisen: Rekursive Definitionen sind nicht erlaubt.

Mit der DTrace-Software werden im Systemverzeichnis /usr/lib/dtrace eine Reihe von D-Quelldateien installiert, die Inline-Direktiven zur Verwendung in Ihren D-Programmen enthalten. So enthält beispielsweise die Bibliothek signal.d Direktiven der Form:

inline int SIGHUP = 1;
inline int SIGINT = 2;
inline int SIGQUIT = 3;
...

Diese Inline-Definitionen ermöglichen den Zugriff auf den in signal(3HEAD) beschriebenen aktuellen Signalnamensatz in Solaris. Analog enthält die Bibliothek errno.d Inline-Direktiven für die errno-Konstanten in C, die in Intro(2) beschrieben sind.

Standardmäßig nimmt der D-Compiler alle bereitgestellten D-Bibliotheksdateien automatisch auf, sodass die Definitionen in jedem D-Programm verwendet werden können.