#define mit variabler Parameteranzahl?
-
Hi,
ich habe folgendes "Makro":
#define MY_OUTPUT(x) printf(x);ACHTUNG: printf, ist nur zum testen da! In "echt" benutz ich eine eigene Funktion die etwas anderes macht, aber zum Testen reicht printf total.
Jetzt möchte ich dieses Makro gerne so benutzen wie printf, also:
MY_OUTPUT ("%s", "Hallo"); MY_OUTPUT ("%s %s", "Hallo", "Welt!");Doch das will nicht

Jetzt habe ich bei meiner google-Suche folgendes gefunden:
http://www.zfx.info/DisplayThread.php?MID=203689Doch das will absolut nicht was die da sagen!
Bei dem hier:
#define MY_OUTPUT(x) printf("%s", x);Bekomme ich folgende Warnungen:
main.cpp(22) : warning C4002: too many actual parameters for macro 'MY_OUTPUT'
main.cpp(23) : warning C4002: too many actual parameters for macro 'MY_OUTPUT'Und bei der Ausgabe kommt "%s %s %s",
Bei diesem hier was die posten und angeblich laufen soll:
#define MY_OUTPUT(x...) printf(x);Bekomme ich folgenden Compilerfehler:
main.cpp(18) : error C2010: '.' : unexpected in macro formal parameter listGeht das mit #define überhaupt? Wenn ja wie? Bitte nicht sagen das ich dafür eine Extra klasse schreiben soll mit überladenem () operator

Danke im voraus!
-
Wenn du unbedingt C hacken willst, dann mach es so:
struct Log { static Log& getSingleton(); //Singleton-Pattern nachschlagen! void operator()(const char* fmt, ...); //Die Funktion mach die ganze Arbeit }; #define MY_OUTPUT Log::getSingleton() //Verwendung: MY_OUTPUT("%s %s %s","Hallo"," ","Welt!");
-
@Any
naja das möchte ich eben nicht, da ich auch an diese funktion noch daten ala __FUNC__, __DATE__, __FILE__ und __TIME übergebe, daher fällt das mit dieser Operatormethode flach
-
struct Log { static Log& getSingleton(); //Singleton-Pattern nachschlagen! Log& operator()(const char* fmt, ...); //Die Funktion mach die ganze Arbeit }; #define MY_OUTPUT Log::getSingleton()("Formatstring", __FUNC__, __DATE__, ..) //Verwendung: MY_OUTPUT("%s %s %s","Hallo"," ","Welt!");Der operator() gibt jetzt ne Referenz auf das Log-Objekt zurück
-
Und was hindert dich daran, die benötigten Daten mit ins Objekt zu ziehen?
class Log { private: const char* file_; public: void operator ()(const char* fmt, ...); Log(const char* file) : file_(file) { } }; #define MY_OUTPUT Log(__FILE__)