Was bewirkt dieses #define (mit namespace und \)?
-
Hallo! Bin Anfänger und deshalb etwas irritiert und erlaube mir auch diese für Euch dumme Frage: Was genau macht dieses #define und warum wird \ benutzt?
#pragma once #include <boost/config.hpp> // for BOOST_NO_STD_LOCALE #if !defined(BOOST_NO_STD_LOCALE) && !defined(_WIN32_WCE) #include <locale> // for std::locale and std::isxxx #include "../../../config/nullary_parser.hpp" #include "../../../state/increment.hpp" #include "../../../state/is_end.hpp" #include "../../../utility/use.hpp" #define BISCUIT_DEFINE_LOCALE_PARSER(name, pred) \ namespace biscuit { \ \ BISCUIT_NULLARY_PARSER_STRUCT(name) \ { \ template< class State, class UserState > \ static bool parse(State& s, UserState& us) \ { \ if (state_is_end(s)) \ return false; \ \ if (!pred(*s.get_cur(), std::locale())) \ return false; \ \ state_increment(s); \ \ biscuit::use(us); \ return true; \ } \ }; \ \ } \ /**/ #else #define BISCUIT_DEFINE_LOCALE_PARSER(name, pred) #endif // !defined(BOOST_NO_STD_LOCALE) && !defined(_WIN32_WCE)
Vielen Dank!
-
#define definiert Makros, die vom Präprozessor ersetzt werden, bevor der Code an den eigentlichen Compiler geht. Zum Beispiel:
#define FOO 0 std::cout << FOO << FOO;
wird zu
std::cout << 0 << 0;
Das geht auch mit Parametern, etwa wird
#define FOO(bar) bar << bar std::cout << FOO(0);
zu
std::cout << 0 << 0;
In Makrodefinitionen kann ein Backslash am Zeilenende benutzt werden, um anzuzeigen, dass die nächste Zeile auch noch zur Makrodefinition gehört, so wird
#define FOO(bar) bar \ << \ bar std::cout << FOO(0);
zu
std::cout << 0 << 0;
Im Übrigen bin ich mir ziemlich sicher, dass du als Anfänger noch nicht dazu in der Lage bist, eine Parserbibliothek im Detail zu verstehen. Es handelt sich dabei um ziemlich komplexe Materie, für die man neben guten Sprachkenntnissen auch ein Verständnis formaler Sprachen benötigt.
-
seldon schrieb:
Im Übrigen bin ich mir ziemlich sicher, dass du als Anfänger noch nicht dazu in der Lage bist, eine Parserbibliothek im Detail zu verstehen. Es handelt sich dabei um ziemlich komplexe Materie, für die man neben guten Sprachkenntnissen auch ein Verständnis formaler Sprachen benötigt.
Dito. Kurz gesagt ist es auch so: Makros erhöhen die Bequemlichkeit, verschlechtern leider aber meist auch die Lesbarkeit. Als Anfänger sind diese #define wohl doch eher sowas wie die Compilestruktur des Codes:
Beispielsweise die Struktur
#ifndef <tag> #define <tag> // Your definitions #endif
wirst du in vielen Projekten finden und benutzen, oder spezifische Compilerdirektiven wie:
#pragma once // Your definitions
Die gleiche Bedeutung haben, aber das oben geht immer und unten ist MSVS. Damit erreichst du, dass deine Definition nicht 2x eingelesen werden können. Und der Compiler meckert, dass doppelte Sachen definiert wurden.
Das anderen sind Schweinereien (ich weiß ganz genau, wer sich gegen diese Aussage auflehnen wird), die Luxus sind und es geht auch ohne.
-
Danke für eure Antworten und die damit verbundene Mühe. Ich bin auf diesen Code gestossen und habe einfach nicht verstanden womit ich google füttern muss um eine Antwort zu finden. Das habt ihr mir jetzt abgenommen. Danke sehr!!!
-
Du musst google einfach mit "define c++" füttern, dann an erster Stelle ist schon ein Link. Mit der Raute vor define oder mit Sonderzeichen allgemein hast Schwierigkeiten, aber ansonsten findet man alles.
Der Vorteil von einem Forum ist nur, dass einige wohl die Antwort bereits wissen, aber dennoch basiert das Wissen, dass man sich über ein Forum aneignet eher auf Tipps, bzw. sollte. Es bringt nämlich nichts, wenn Dir alle define erklären und eigentlich hatte das schonmal jemand erklärt. Ich sollte auch mehr mit Referenzen arbeiten, denn Du warst ein bisschen recherchefaul!