Ist das eine Makrodefinition?



  • Hallo zusammen,

    ich muss gerade einen recht umfangreichen mir unbekannten Quellcode lesen und verstehen und da ich von C nicht so viel Ahnung habe, habe ich eine Frage.

    Ich bin über folgende #DEFINE-Anweisung gestolpert:

    #define STATIC
    

    und etwas in der Art

    #define ABC(abc)
    

    Nun weiss ich nicht, ob es sich hierbei um ein Makro handelt und wenn ja, wo es definiert ist (ok, das kann man natürlich ohne den Quellcode nicht sagen, also ist die Frage, was das #DEFINE hier bedeutet).

    Ich wundere mich, weil es ja überall heisst, dass Makros in der Form

    #define <name>[(<param>)] <code>

    definiert werden!?

    Ich bin für jede Hilfe dankbar und sage schonmal vielen Dank im Voraus!



  • Passt doch überall:
    #define <name>[(<param>)] <code>
    name: ist bei beiden Makros vorhanden
    [(<param>)] die eckige Klammer heisst, optional, da passt doch alles (obwohl: <param> müsste eher <params> heissen, da mehrere auch erlaubt sind)
    <code>: ist bei der ersten Definition leer, STATIC im Code wird daher verschwinden, bei der anderen ist er vorhanden.



  • das Makro ist auch in diesem Fall vollständig definiert.
    Es ist einfach nur leer.
    Das bedeutet, der Compiler ersetzt es durch nichts.

    Sowas gibt es häufig, wenn code für mehrere Compiler optimiert ist,
    und ein Compiler gewisse keywords kennt, die ein anderer nicht kennt.
    Selbiges gilt bei plattformübergreifender Entwicklung.



  • Ja, das ist eine Makrodefinition und ja, normalerweise würde da noch Code dazu gehören wie z.B.

    #define ABC(abc) printf("Fehler: %i", (abc))
    

    Der Präprozessor würde jetzt z.B. das ABC() im Code durch den printf() Aufruf ersetzen und den Parameter dort einsetzen.

    Genau so ersetzt er das Makro im Code durch NICHTS wenn keine Funktion angegeben ist. Hat man mit einem solchen Makro z.B. Debugausgaben (wie in meinem Bsp.) definiert kann man diese duch eine (Neu) Definition ohne funktion bequem aus dem Code entfernen.


Anmelden zum Antworten