none
Code-Erklärung RRS feed

  • Frage

  • Hallo,

    ich bin auf ein Beispiel gestoßen welches mein Interesse geweckt hat, ist aber leider C++ - nicht ganz meine Welt. :=(

    Hier ein Codeblock den ich nicht verstehe.

        int p = (int)(t / delta_t);
        // Compute local control point indices
    #define BOUNDS(pp) { if (pp < 0) pp = 0; else if (pp >= (int)vp.size()-1) pp = vp.size() - 1; }
        int p0 = p - 1;     BOUNDS(p0);
        int p1 = p;         BOUNDS(p1);
        int p2 = p + 1;     BOUNDS(p2);
        int p3 = p + 2;     BOUNDS(p3);

    vp ist so deklariert:

    std::vector<vec3> vp;

    Mir geht es um die Präprozessor-Anweisung. Was mach diese und wo kommt "pp" her.

    Danke für jede Hilfe

    Gruß Scotty

    Mittwoch, 8. April 2015 12:46

Antworten

  • pp ist definiert in BOUNDS(pp)

    #define BOUND(pp)...

    definiert eine "Funktion" mit einem Argument. pp ist dabei der Platzhalter. Es erfolgt eine Substitution. Und pp wird ersetzt durch das was der User schreibt.

    BOUNDS(p0);

    wird also zu dem folgenden Code:

    { if (p0 < 0) p0 = 0; else if (p0 >= (int)vp.size()-1) p0 = vp.size() - 1; }

    Ich halte von so was gar nichts. Das hätte man auch mit einer inline Funktion oder einem Lambda lösen können.

    Denn auch so ein Schrott Frist der Compiler mit tollen Fehlermeldungen

    BOUNDS(x+y)


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

    Mittwoch, 8. April 2015 13:11
    Moderator

Alle Antworten

  • pp ist definiert in BOUNDS(pp)

    #define BOUND(pp)...

    definiert eine "Funktion" mit einem Argument. pp ist dabei der Platzhalter. Es erfolgt eine Substitution. Und pp wird ersetzt durch das was der User schreibt.

    BOUNDS(p0);

    wird also zu dem folgenden Code:

    { if (p0 < 0) p0 = 0; else if (p0 >= (int)vp.size()-1) p0 = vp.size() - 1; }

    Ich halte von so was gar nichts. Das hätte man auch mit einer inline Funktion oder einem Lambda lösen können.

    Denn auch so ein Schrott Frist der Compiler mit tollen Fehlermeldungen

    BOUNDS(x+y)


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

    Mittwoch, 8. April 2015 13:11
    Moderator
  • Hallo,

    #define erstellt eine Art Methode, die noch zur Compile-Zeit wieder entfernt wird - in C++ Makro genannt.

    Das heißt, dass wenn du BOUNDS(a) aufrufst, dass der Aufruf vom Compiler gegen folgendes ersetzt wird:

    {
        if (a < 0)
            a = 0;
        else if (a >= (int)vp.size()-1)
            a = vp.size() - 1; 
    }
    
    pp stellt dabei den Parameter des Markos dar.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Mittwoch, 8. April 2015 13:25
  • Ich muss mich da dem Martin Richter anschließen, Makros sind zwar geniale Werkzeuge, aber nur wenn die Aufgaben klein sind.

    Bei soetwas wie

    #define MAX(a,b) a < b ? b : a
    

    ist das Makro sehr praktisch, aber bei längeren Sachen kann man inline-funktionen verweden. Diese weden vom Compiler in den Code an der genannten Stelle gienegüft (ohne Sprung, fast wie beim Makro), erlauben aber die nutzung von Typsicherheit (welchen typen haben die variablen, int, long, short?).

    PS: Moderne Compiler dürfen das inline-Atribut ignoreiren und entscheiden selbst, ob sich soetwas lohnt oder nicht.


    © 2015 Thomas Roskop

    Germany // Deutschland

    Mittwoch, 8. April 2015 14:06
  • Hallo Martin und auch alle anderen,

    danke für Eure Antworten. Ich hätte jetzt auf eine Inline-Function getippt, das dieses ein Macro wird hätte ich nicht gedacht. Makros kenne ich aus der Assemblerwelt und da mache ich oft gebrauch von. Aber das es so etwas in einer Hochsprache gibt aber ich noch nie gehört, würde ich auch nie dort einsetzen weil ich weiß was ein Makro kann und es dadurch zu Fehlern kommen kann die nur sehr schwer zu finden sind.

    Danke nochmals

    Gruß Scotty

    Donnerstag, 9. April 2015 02:20
  • Und in Zeiten von templates kann man solch ein MAX Makro auch typischer gestalten, so, dass es keine Seiteneffekte hat....

    Man denke nur an

    int schrott = MAX(i++,j++);


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

    Donnerstag, 9. April 2015 06:29
    Moderator