Makro mit varargs
-
seldon schrieb:
Ich denke mal
#define LOG_INFO(...) Log(TypeInfo, __VA_ARGS__);...allerdings ist das streng genommen kein C++; erst der C99-Präprozessor kann so was. Bist du vielleicht im falschen Forum gelandet?
Wie soll das gehen? Wenn ich varargs benutze, muss ich doch an Log() 3 Parameter uebergeben?!
-
PS: Ich kann kein C++11 benutzen. Nur Standard C/C++
-
RibRob22 schrieb:
Nur Standard C/C++
Na, was denn? C++ kennt sowieso keine variadischen Makros, C schon. Und C++11 ist Standard.
-
Es geht also nicht?
-
Ich weiß, das mag jetzt wie schwarze Magie rüberkommen, aber wieso nicht:
inline void LogInfo(char const* fmt, ...) { Log(TypeInfo, fmt, ...); }Oder wie auch immer die korrekte Syntax aussieht. (Hab mich nie mit VA-Lists beschäftigt)
-
Ethon_notloggedin schrieb:
Ich weiß, das mag jetzt wie schwarze Magie rüberkommen, aber wieso nicht:
inline void LogInfo(char const* fmt, ...) { Log(TypeInfo, fmt, ...); }Oder wie auch immer die korrekte Syntax aussieht. (Hab mich nie mit VA-Lists beschäftigt)
die ... kann man nicht einfach weiterreichen, nur die valist die dabei rauskommt. Und dafür müsst man dann wieder ne Funküberladung machen.
greetz KN4CK3R
-
Vielleicht sagste mal, was du machen willst und nicht wie du es machen willst.
-
RibRob22 schrieb:
PS: Ich kann kein C++11 benutzen. Nur Standard C/C++
Was heißt denn "Standard C/C++" für Dich? Meinst Du C90? Oder C99? Oder C++03? Die variadischen Makros gibt's offiziell nur in C99 und C++11 und inoffiziell dort, wo der Compiler es eben als Erweiterung unterstützt. Und für "C/C++" gibt es keinen Standard.
-
krümelkacker schrieb:
RibRob22 schrieb:
PS: Ich kann kein C++11 benutzen. Nur Standard C/C++
Was heißt denn "Standard C/C++" für Dich? Meinst Du C90? Oder C99? Oder C++03? Die variadischen Makros gibt's offiziell nur in C99 und C++11 und inoffiziell dort, wo der Compiler es eben als Erweiterung unterstützt. Und für "C/C++" gibt es keinen Standard.
Keine Ahnung was ich hab. Ich benutze gcc version 4.4.1.
-
RibRob22 schrieb:
krümelkacker schrieb:
RibRob22 schrieb:
PS: Ich kann kein C++11 benutzen. Nur Standard C/C++
Was heißt denn "Standard C/C++" für Dich? Meinst Du C90? Oder C99? Oder C++03? Die variadischen Makros gibt's offiziell nur in C99 und C++11 und inoffiziell dort, wo der Compiler es eben als Erweiterung unterstützt. Und für "C/C++" gibt es keinen Standard.
Keine Ahnung was ich hab. Ich benutze gcc version 4.4.1.
Variadic Templates gibts ab gcc 4.3
Die Variadic Macros gibts zu 99.9% auch schon (gcc unterstützt sie im C Modus ja auch).Möglicherweise musst du halt "-std=cc+0x" übergeben.
-
RibRob22 schrieb:
Keine Ahnung was ich hab. Ich benutze gcc version 4.4.1.
Dann sag doch gleich, dass du nicht weißt, welche Sprachstandards dein Compiler unterstützt.
Und dann gib uns am Besten noch die info, nach der gefragt wurde: Was willst du erreichen? (Siehe auch Link in meiner Signatur)
-
pumuckl schrieb:
RibRob22 schrieb:
Keine Ahnung was ich hab. Ich benutze gcc version 4.4.1.
Dann sag doch gleich, dass du nicht weißt, welche Sprachstandards dein Compiler unterstützt.
Und dann gib uns am Besten noch die info, nach der gefragt wurde: Was willst du erreichen? (Siehe auch Link in meiner Signatur)
Is doch Wurst wozu ich das brauch. Das ist ne klare Frage und entweder geht es oder nicht.
Nur fuer die Klugscheisser: Ich will einfach eine Logfunktion per Makro aufrufen, damit im Debug Modus die Logfunktion NICHT aufgerufen wird. Und ist jetzt die Frage auf magische Art beantwortbar geworden?

-
RibRob22 schrieb:
Is doch Wurst wozu ich das brauch. Das ist ne klare Frage und entweder geht es oder nicht.
Nur fuer die Klugscheisser: Ich will einfach eine Logfunktion per Makro aufrufen, damit im Debug Modus die Logfunktion NICHT aufgerufen wird. Und ist jetzt die Frage auf magische Art beantwortbar geworden?

Okay, klare Antwort: was du tun willst geht nicht. Was du erreichen willst ginge ohne große Probleme und ohne Makrokacke, aber ich will ja nicht klugscheißen, also halt ich die Klappe.
-
Na geht doch. Wieso nicht gleich so!?
Wobei es mich ja schon interessieren wuerde, wie man OHNE Makros Funktionsaufrufe rausfiltern kann im Release Mode.

-
RibRob22 schrieb:
Wobei es mich ja schon interessieren wuerde, wie man OHNE Makros Funktionsaufrufe rausfiltern kann im Release Mode.

Nö, eben hast du noch behauptet, dass dich nur die Antwort auf deine Frage interessiert. Dich jetzt plötzlich doch für andere Lösungswege zu interessieren, nachdem du pampig geworden bist, kommt bissle spät.
-
Wir wissen beide, dass es nur mit Makros geht.
Echt traurig, wie oft es in diesem Forum nach diesem Muster laeuft:
OP: Simple Frage
Forenklugscheisser: Was willst du ueberhaupt machen?
OP: Sagt es, obwohl es irrelevant ist
Forenklugscheisser: Mieses Design!
-
RibRob22 schrieb:
Wir wissen beide, dass es nur mit Makros geht.
typedef void (*logging_function_t)(char const *, ...); logging_function_t LOG_INFO = DEBUG ? Log_noop : Log;
-
seldon schrieb:
RibRob22 schrieb:
Wir wissen beide, dass es nur mit Makros geht.
typedef void (*logging_function_t)(char const *, ...); logging_function_t LOG_INFO = DEBUG ? Log_noop : Log;LOL. Ja genau, wir frickeln uns jetzt voellig weltfremde Konstrukte, die dennoch NICHT das selbe machen wie Makros. Denn hier wird nach wie vor eine Dummyfunktion aufgerufen. Ich sagte aber, dass jegliche Log Funktionsaufrufe ausgefiltert werden sollen. Abgesehen davon, dass man per HAND je nach Mode DEBUG anders initialisieren muesste. Fail.

-
Bevor du dich noch tiefer in die Scheiße reitest, mache ich mal zu deinem eigenem Nutzen zu. Vielleicht hast du dann die Chance, dass du in Zukunft doch noch einmal ernst genommen wirst, wenn Gras über diese Sache gewachsen ist.