Was ist das eigentlich und wozu ?
Direktiven sind kurz gesagt Compiler Eigenschaften, sie geben definitionen an die extra für den Compiler sind,
sie grenzen Bereiche ein , können bestimmen was in den Stack kommt, der Stack ist der Code Zwischenspeicher,
sprich so kann man einfach bestimmen was der Compiler tun soll, worauf er achten soll, ja sogar der Speicher
des Codes lässt sich Manipulieren.
Wie beginnen Direktiven ?
Sie beginnen immer mit der Raute, das gibt an , das diese Zeile eine bestimmte Option angibt.
Hinter einer Direktive können Abfragen mit Variablen aus dem Code entstehen sowohl auch Variablen aus dem
Präprozessor ( Präprozessor verarbeitet Direktiven und weist sie zu )
Fangen wir mit ,,define´´ diese Option setzt eine feste Compiler Variable,
die nur vom Präprozessor noch einmal verarbeitet werden kann, vom Code selber nicht!
Wie jede andere Direktive, sie sind wie feste Variablen ( Kontanzen )
Hier mal die wichtigsten Direktiven
- #if
- #else
- #endif
- #pragma
- #include
- #tryinclude
- #undef
Als erstes beginnen wir wie man sieht man #if #else und #endif , diese 3 Direktiven Funktionieren wie gewöhnliche Abfragen,
Unterschied zum normalen Code ist im Präprozessor wie man sieht, man braucht keine Blocks / Brackets { } ,
diese werden vom Präprozessor nicht beachtet sprich :
#define VARIABLEFEST 50
#if VARIABLEFEST == 50
funktionbla()
{
#endif
return 1;
}
So ist der Wert nun nicht 50 so wird der Code nicht mit in den Zwischenspeicher geschmissen und existiert in unserer Ausgabe auch nicht,
also da aber jeder Block Vollständig sein muss und eine Anweisung besitzen muss, ergibt dies einen Fehler im Code,
da der Kopf mit dem Anfang nicht existiert sobald die Variablen des Präprozessors nicht 50 ist.
Da wir gerade bei den Variablen sind , diese können auch abgefragt werden, ob sie definiert wurden oder nicht,
als Beispiel :
#if defined VARIABLEFEST
#endif
Hier lässt sich ebenfalls wie bei er normalen Abfrage mit Boolean also dem Wahr/Falsch Prinzip arbeiten,
die höchste Regel ! Immer wenn ich kein gleich benutzte also einen bestimmten Wert haben will muss
die Negativ / Positiv Prüfung vo der Funktion stattfinden die Wahr / Falsch wiedergibt ,
sont schlägt die Logik Fehler , es heißt ja nicht
wenn definiert nicht gleich VARIABLEFEST
sondern::
wenn nicht definiert VARIABLEFEST
Wenn man das mit Wörtern nachvollzieht kann man so gut wie nicht scheitern, da jeder die nötige Logik besitzen müsste
um diese Sätze zu verstehen, denn auch die Sprache wurde von einem Menschen gemacht, also basiert alles auf
Menschlicher Logik.
Kommen wir zu ,,pragma´´ , diese Option stellt den Compiler ein und sagt ihm wie er konvertieren soll,
sprich welche Koordierung genutzt werden soll, wie viel Speicher reserviert werden soll,
wie viel Tabs verwendet werden für die Struktur , auch Variablen können als unnütz gekennzeichnet werden und
so einfach entfernt werden, das gilt für die vom Code erstellte Variablen, für die Präprozessor Variablen
benutzt man gewöhnlich ,,undef´´ als Option.
#pragma unused VARIABLEN_NAME
#pragma tabsize 2 // 2 tabs als Struktur nötig
Da ich die Option ,,undef´´ schon währendessen erklärt habe, kommen wir zu den letzten 2 wichtigen
Optionen die mehr oder weniger zusammegehören und jede hat ihre Funktion.
,,include´´ kennt jeder , damit bezieht man Externe Dateien ein die in den Code einbezogen werden,
hierbei dienen Externe Dateien immer als Ablage um eine gewisse Übersicht zu behalten,
groß Erklären müsste ich hoffentlich nichts.
,,tryinclude´´ wie der Begriff sagt, ausprobieren , Funktion vollkommen gleich ABER ,
sobald diese Datei nicht vorhanden ist, wird kein Fehler ausgegeben und die Direktive wird
ignoriert also nur wenn vorhanden.
So zum Schluss eine kleine Zusammenfassung :
Direktiven sind komplex aber während der Laufzeit nicht vom Code aufgreifbar, sprich sobald der Compiler
diese einmal verarbeitet hat verschwinden sie für immer, im Quellcode bleiben sie jedoch vorhanden,
nicht das dies Falsch verstanden wird.
Die Ausgabe Übernimmt alle Einstellung die getroffen werden.
Datentypen & Spezielle Fähigkeiten
Direktiven im Bezug auf ,,define´´ haben noch Spezielle Merkmale
- In ihnen können alle Datentypen Definiert werden ( float,boolean,Integer,String )
- Es können Funktionen verbaut werden
#define KOMMAZAHL 3.14
Wenn man diese Variable nutzt muss die Empfänger Variable ebenfalls vom selben Typ sein.
Da diese Art von Variablen jede Art von Datentyp wiedergeben können, können auch Locker Funktionen verbaut werden :
#define FunktionX(a,b) if(a==b)
Warum diese Art von Funktionen schneller sind ?
Sie greifen Direkt ein sprich da der Präprozessor alles ersetzt und einarbeitet werden diese Abfragen Direkt getätigt & Direkt berechnet.