MAKRO mit var. Anz. von Parametern



  • Hi!

    Ich möchte eine printf-Funktion umbenennen, ohne sie im Code zu verändern.
    Dazu habe ich mir überlegt ein Makro zu verwenden.
    Mein Problem ist, dass ich nicht weiß, ob und wie man mit Makros eine Variable Anzahl von Parametern übergibt.

    So soll es aussehen:
    #define debug(string, ...) dip204_write_string(string, ...)
    Das klappt aber so nicht!

    So würde man es normal benutzen:
    dip204_write_string("Text mit Zahl %d", 33);

    Ich will es so benutzen:
    debug("Text mit Zahl %d", 33);

    Ich könnte eine neue Funktion definieren, aber die würde dann immer aufgerufen werden und zusätzlichen Stack-Speicher verbrauchen, der bei mir knapp ist.
    Daher die Makro-Variante.

    Vielleicht kann mir da jemand weiter helfen.

    Gruß,
    Tabi



  • das geht so allerdings nur mit einem C99-compiler: http://en.wikipedia.org/wiki/Variadic_macro
    irgendwie gab's auch einen trick, wie sowas ähnliches (mit anderer syntax natürlich) mit nicht-C99 compilern geht. aber der fällt mir gerade nicht ein.
    🙂



  • Tabaluga schrieb:

    Hi!
    Ich könnte eine neue Funktion definieren, aber die würde dann immer aufgerufen werden und zusätzlichen Stack-Speicher verbrauchen, der bei mir knapp ist.
    Daher die Makro-Variante.

    Vielleicht kann mir da jemand weiter helfen.

    Gruß,
    Tabi

    Ach, wenn man printf aufruft wird kein Stackframe eingerichtet?



  • wie siehts aus mit nem Funktionspointer, der je nach Bedarf auf printf(), dip204_write_string() oder eine andere Funktion gleicher Signatur verweist?



  • ein solch ein Pointer müsste im Porgramm geführt werden und wie der Name schon sagt soll die Funktion zu Debug-zwecken verwendet werden.

    Der Tipp von fricky hat mir sehr geholfen.
    Ich habs über das Wicki hinbekommen:
    #define ow_lcd(...) dip204_printf_string (__VA_ARGS__)

    Vielen Dank 🙂



  • #if defined(GCC_VARMACROS)
    	#define reply(ARGS...)	send_message(user, ARGS)
    #elif defined(C99_VARMACROS)
    	#define reply(...)		send_message(user, __VA_ARGS__)
    #endif
    

Anmelden zum Antworten