Unterschied bei #define zur "normalen" Definition

  • Der Unterscheid ist einfach, dass #define ein Preprocessor Command ist.
    Heißt: beim Compilen der Funktion wird einfach jedes __MEINMACRO mit dem Gegenüber des #defines eingefügt.


    Beispiel:

    C
    1. // vor dem preprocessen in der sqf-Datei
    2. #define __TEST 123
    3. hint str __TEST;
    4. // nach dem preprocessen steht in der Funktionsvariable
    5. hint str 123;


    Heißt im Umkehrschluss: ein #define ist eine Konstante, während du eine Variable My_var jederzeit überschreiben kannst (ausgenommen compileFinal).


    Mit #define setzt man nur Werte (keine Variablen) ein, die nicht mehr geändert werden sollen (also nach dem Abspeichern der sqf-File).
    SQF unterstützt keine "richtigen" Konstanten (wieder: compileFinal isses einfach nicht dafür; nur, wenn z.B. ein vom Server generierter Wert nicht mehr geändert werden soll [z.B. Session-Keys o.ä]).
    Klar kann man auch #define __MyVar My_Var machen, das erinnert mich dann aber eher an Tonic's AltisLife Logik und ist äußert selten empfehlenswert.



    Kleines Anwendungsbeispiel:

    Du möchtest nicht, dass dafür extra eine Variable verwendet wird. Weil: sie wird nicht verändert, ergo nicht gebraucht.
    Eine private Variable macht es hier z.B. auch keinen Sinn (wird nicht verändert -> Konstante).
    Mit einer globalen Variable verhunzt am Ende ein Scriptkiddy (my_var = "ololol";) oder ein Fehler anderswo deine Funktion. Macht man auch einfach nicht, wenn es nicht gebraucht wird (z.B. wenn du diese Variable explizit global für alle Funktionen ändern möchtest).




    Weiterführender Link zum ArmA3-Preprocessor: https://community.bistudio.com/wiki/PreProcessor_Commands

    10 Mal editiert, zuletzt von Insane () aus folgendem Grund: so spät einfach keine Posts mehr verfassen...