Guten Morgen liebe Community,
also ich wollte euch heute nochmal ein wenig die Directives näher bringen, da ich leider immernoch in einigen Threads sowas sehe:
#include <a_samp>
#if defined FILTERSCRIPT
public OnFilterScriptInit()
{
//Hier der entscheidene Code
}
#endif
und dann wundern sich die Leute warum ihr Code nicht aufgerufen wurde
Also, dann fangen wir mal mit dem ersten Directive an:
#define, #undef
Mit #define können wir einen statischen Wert definieren sprich:
#define Butter 1
Jetzt besitzt Butter den Wert 1. Das ist die Einfachste Form einer Definition.
Wir können aber noch viel viel weiter gehen und z.B. eine Funktion auf eine andere schreiben:
#define SCM SendClientMessage
Nun müssen wir nicht immer SendClientMessage(...); schreiben, sondern nur SCM(...);
Aber man kann noch einen Schritt weiter gehen und Makros erstellen mit unterschiedlichen Parametern:
So, nehmen wir nun eine andere Funktion, sagen wir mal printf und wir tauschen jetzt die Parameter sprich von:
printf("Text", rest);
machen wir:
PP(rest, "Text");
Sowas sieht dann so aus:
#define PP(%1,%0) \
printf(%0, %1)
Was auch noch eine Möglichkeit wäre ist, ganze Funktionen bzw Codeschnipsel in so ein Define zu schreiben, quasi sowas:
#define Loop \
new i; i<MAX_PLAYERS; i++) \
if(IsPlayerConnected(i)
//Anwendung:
for(Loop) {
//Hier dann was passieren soll, wenn die Schleife durchläuft.
}
Der char "\" bedeutet, dass das Makro in einer neuen Zeile weitergeht.
So und nun zu der letzten Verwendung für #define (die ich vorstelle es gibt natürlich noch viel mehr), wir bauen uns eine Funktion
Und die machen wir ganz simpel so:
#define Sum(%0,%1) \
((%0) + (%1))
//Verwendung:
printf("%d", Sum(1, 2));//Hier würde 3 geprintet werden
Natürlich gibt es auch Makros die schon in einer Include Datei stehen und die wir nicht für unser Script weiter benutzen wollen und dann machen wir z.B. sowas:
#undef MAX_PLAYERS //Hier wird das Makro entfernt
#define MAX_PLAYERS 50 //Hier mit dem neuen Wert 50 definiert
So nun zu den nächsten Directives:
#if, #error, #else, #endif, #endinput
Dieses Directive macht das selbe wie if(...) nur mit Directive Werten
Sprich:
#define Butter 1
#if Butter == 1
#error Butter ist ja 1
#endif
Dann würde halt im Compiler der Error erscheinen durch #error, dass Butter 1 ist
Natürlich geht das noch ein wenig Komplexer:
#define Butter 10
#if Butter > 10 //Fragt ab ob Butter größer 10 ist
#error Das werden wir nicht sehen//wenn ja das hier
#elseif Butter == 9//oder wenn Butter == 9
#error das werden wir auch nicht sehen//wenn Butter 9 wäre das hier
#else//Wenn nicht
#error das werden wir sehen//dann das hier
#endif//if-Abfrage beendet
Kommen wir nun zu einer wichtigen Verwendung im Zusammenhang mit Includes !
#include <test>//Wir includen eine Include Datei names test
#if defined _TEST_INC
#endinput
#endif
#define _TEST_INC
So verhindern wir, dass eine Include Datei 2x included wird
#assert
Ja, assert ist ein schönes Directive, wenn die Bedingung nicht zutrifft, failt der Compiler und spuckt einen Fatal Error aus, sprich sowas:
#define test 1
#assert test > 10
Da würde das rauskommen:
Das waren erstmal die einfachen Directives, vielleicht werde ich ein 2. Tutorial machen für Leute, die schon etwas besser scripten können, wo ich dann auf #emit und #pragma eingehe
//Edit: Hier geht es zu [ SCRIPTING ] #pragma & #emit
mfg.
-
Spoiler anzeigen ein # zu viel gemacht...