Directives / Makros (pre-processor)

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • 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 :wacko:


    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. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

    5 Mal editiert, zuletzt von Kaliber ()

  • Ein, in meinen Augen, sehr unbrauchbares Tutorial. Zwar zeigt es ein paar Direktiven, aber die sind in meinen Augen genauso selbsterklärend wie include*. In diesem Tutorial wird in die Thematik zu wenig eingegangen, Fragen wie "Wie greift der Compiler auf diese zu / wie werden sie verarbeitet" sind für in meinen Augen ein MUSS, wenn es um den angesprochenden Bereich geht.



    * Dieser Satz ist entstanden, da include von der Priorität her die höchste Direktive ist und scheinbar gewollt nicht genannt / erläutert wurde.

  • Ein, in meinen Augen, sehr unbrauchbares Tutorial. Zwar zeigt es ein paar Direktiven, aber die sind in meinen Augen genauso selbsterklärend wie include*. In diesem Tutorial wird in die Thematik zu wenig eingegangen, Fragen wie "Wie greift der Compiler auf diese zu / wie werden sie verarbeitet" sind für in meinen Augen ein MUSS, wenn es um den angesprochenden Bereich geht.



    * Dieser Satz ist entstanden, da include von der Priorität her die höchste Direktive ist und scheinbar gewollt nicht genannt / erläutert wurde.


    Dieses Tutorial ist für Anfänger gedacht und ich fand es nicht so klug direkt zu erklären wie der Compiler das verarbeitet, da das ja nicht direkt was mit dem Scripten damit zu tun hat ^^
    un Include habe ich weggelassen, da das der einzige Directive mit Tryinclude ist, den man nicht wirklich erklären muss (wenn man ein wenig englisch kann) ^^


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S


  • Dieses Tutorial ist für Anfänger gedacht und ich fand es nicht so klug direkt zu erklären wie der Compiler das verarbeitet, da das ja nicht direkt was mit dem Scripten damit zu tun hat ^^
    un Include habe ich weggelassen, da das der einzige Directive mit Tryinclude ist, den man nicht wirklich erklären muss (wenn man ein wenig englisch kann) ^^


    mfg. :thumbup:


    Die meisten Anfänger brauchen das aber nicht und können damit sowieso nichts anfangen.

  • Die meisten Anfänger brauchen das aber nicht und können damit sowieso nichts anfangen.


    Naja, wenn sie sich das durchgelesen haben, haben sie zumindest einen groben Einblick und ich hoffe der 1. Fehler den ich gepostet habe taucht nicht mehr so oft auf ;)


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Finde das Thema an sich sehr spannend.
    Gut Beschrieben hast du auch alles, jedoch hast du teilweise falsche Begriffe verwendet.
    z.B. werden mit #define keine Variablen definiert, denn das geht mit "new variable"
    Ebenso hast du zwar #error verwendet, aber nirgens erklärt.
    Dein Beispiel bei #endinput hättest du auch eventuell mal erklären können.


    Was mich aber eindeutig am meisten stört, ist, dass es bei weitem nicht vollständig ist. Prinzipiell hast du nur #assert, #define und #if wirklich erklärt.
    Ich hätte mir gewünscht, dass du noch ein paar #pragma-Sachen reingebracht hättest. Auch #inlcude wäre sinnvoll.


    Außerdem wäre es sehr schön, wenn du erklären wirst, was beim Kompilieren dabei vor sich geht. Du hast in der Überschrift was von pre-processor geschrieben, aber gerade darauf gehst du nicht weiter ein. Wenn ich allein das lese, was du bei #if geschrieben hast, sehe ich keinen Unterschied zwischen #if und if. Und zwischen deinem #define und den Variablen sehe ich ebenfalls keinen Unterschied, bis darauf, dass man schlecht Funktionen in eine Variable fassen kann. Aber genau der Grund, warum es bei Variablen nicht geht, aber bei #define schon, das ist doch erst das total spannende daran.


    So wie es also jetzt ist, ist es absolut unvollständig, meiner Meinung nach. Bau es weiter aus. Nimm dir die Tipps hier zu Herzen, denn deine Sprache etc. ist wirklich sehr schön, und damit hast du den ganzen Tutorials, bei denen man Wort für Wort entziffern muss, ganz schön was voraus.

  • Okay, ich nehme mal kurz deinen Beitrag auseinander und sage was dazu:


    Ebenso hast du zwar #error verwendet, aber nirgens erklärt.


    #error = Erzeugt einen error (das steht da auch grob)


    ch hätte mir gewünscht, dass du noch ein paar #pragma-Sachen reingebracht hättest.


    Lese meinen letzten Satz...


    Auch #inlcude wäre sinnvoll.


    Das Directive Included eine Include datei, mehr aber auch weniger nicht.


    Du hast in der Überschrift was von pre-processor geschrieben, aber gerade darauf gehst du nicht weiter ein.


    Okay, da hast du recht, ich denke ich baue das noch ein wenig aus, wie der Compiler das ganze Script verarbeitet...


    sehe ich keinen Unterschied zwischen #if und if


    Dann hast du nicht genau hingeschaut, du kannst #if im Gegensatz zu if egal wo im Script verwenden.


    das ist doch erst das total spannende daran.


    Dein Leben scheint nicht sehr aufregend zu sein, wenn du es als "so spannend" hälst, dass der Compiler die Directives vor allem anderen verarbeitet :D


    Naja, ich werde es evtl noch hier und da ein wenig ausbauen :D


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

    Einmal editiert, zuletzt von Kaliber ()

  • d.h. da müsste noch ein Platzhalter (kA. wie der Fachbegriff lautet) hin!
    War sicher ein Denkfehler


    Nein, aus folgendem Grund:


    1. Das würde keinen Error ergeben ^^


    2. Text = "Der Text den man da stehen hat...das ist ein Benutzerfreundliches Beispiel" :D


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S