Problem mit __LINE__
-
interpreter schrieb:
Nö, eben nicht, weil sie in einem eigenen Block liegen.
achso, ich dummerchen, die klammern waren zuviel.
class C { public: C() {printf ("C ctor\n");} void f() {printf ("danke interpreter, so geht's jetzt\n");} }; #define CREATE_C(x) C C_##x; printf("Object created in line: %d\n",__LINE__); int main () { CREATE_C(a) CREATE_C(b) C_a.f(); C_b.f(); }
-
Danke für f()
-
optional noch ein
#ifdef CREATE_C #error CREATE_ALREADY_DEFINED #else #define CREATE_C /* ... */ #endif
Und das C_ als Prefix würd ich mir abgewöhnen.
-
davie schrieb:
Und das C_ als Prefix würd ich mir abgewöhnen.
irgendwas muss da hin wegen des ##. ganz ohne frisst es der präprozessor nicht
-
net schrieb:
irgendwas muss da hin wegen des ##. ganz ohne frisst es der präprozessor nicht
Wieso lässt du dann ## nicht einfach weg?
Irgendwer schrieb:
Der Nachteil dabei ist, dass du den Konsruktor von der cpp Datei in den Header verfrachten musst.
Naja, Nachteil ist relativ, da das Template Klassen nun mal so an sich haben.
Viel schlimmer finde ich, dass du mit solchen defines Namespace Hierarchien auflöst.
-
groovemaster2002 schrieb:
Wieso lässt du dann ## nicht einfach weg?
könnte sein, dass es dann nicht das macht, was es soll?
probier's aus.
-
Es macht schon das was es soll, solange du dir mit anderen defines keine Namenskonflikte baust. Die können dir aber auch mit C_## passieren.
-
groovemaster2002 schrieb:
Es macht schon das was es soll
ehrlich? auch mit verschiedenen namen?
zeig mal bitte wie...
-
#define CREATE_C(x) C x; printf("Object created in line: %d\n",__LINE__); int main () { CREATE_C(a) CREATE_C(b) a.f(); b.f(); }
(ungetestet)
-
cool! das funzt.
-
class Foo {}; // der Typ, um den es geht void log ... // die Logging-Funktion #define FOO log(__LINE__); Foo int main () { FOO instanz; // sieht sehr natürlich aus! }
Doof ist nur, wenn jemand versucht dynamisch ein Objekt anzulegen. "new FOO" würde in "new log(__LINE__); Foo" gewandelt, was nicht gehen kann.