Benutzer mit den meisten Antworten
Code-Erklärung

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
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
- Als Antwort vorgeschlagen Martin RichterModerator Mittwoch, 8. April 2015 13:12
- Als Antwort markiert Karsten Sosna Donnerstag, 9. April 2015 02:20
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
- Als Antwort vorgeschlagen Martin RichterModerator Mittwoch, 8. April 2015 13:12
- Als Antwort markiert Karsten Sosna Donnerstag, 9. April 2015 02:20
-
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 -
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
-
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
-