Ich möchte ein Makro in C schreiben, das eine beliebige Anzahl von Parametern akzeptiert, keine bestimmte Anzahl
Beispiel:
#define macro( X ) something_complicated( whatever( X ) )
Wo X
ist eine beliebige Anzahl von Parametern
Ich brauche das, weil whatever
es überlastet ist und mit 2 oder 4 Parametern aufgerufen werden kann.
Ich habe zweimal versucht, das Makro zu definieren, aber die zweite Definition hat die erste überschrieben!
Der Compiler, mit dem ich arbeite, ist g ++ (genauer gesagt mingw)
c
g++
c-preprocessor
variadic
hasen
quelle
quelle
Antworten:
C99 Weg, auch vom VC ++ Compiler unterstützt.
quelle
##
wird nicht benötigt und ist nicht tragbar.#define FOO(...) printf(__VA_ARGS__)
erledigt die Arbeit auf tragbare Weise; Derfmt
Parameter kann in der Definition weggelassen werden.__VA_ARGS__
ist der Standardweg, um es zu tun. Verwenden Sie keine compilerspezifischen Hacks, wenn Sie dies nicht müssen.Ich bin wirklich genervt, dass ich den ursprünglichen Beitrag nicht kommentieren kann. In jedem Fall ist C ++ keine Obermenge von C. Es ist wirklich albern, Ihren C-Code mit einem C ++ - Compiler zu kompilieren. Tu nicht was Donny nicht tut.
quelle
class
durchklass
zu ersetzen, um das Kompilieren mit einem C ++ - Compiler zu ermöglichen. Beachten Sie auch, dass es einige Unterschiede gibt, die Sie stören werden. Zum Beispiel wird der ternäre Operator in beiden Sprachen nicht auf die gleiche Weise bewertet, und dasinline
Schlüsselwort bedeutet etwas völlig anderes (wie ich aus einer anderen Frage gelernt habe).Ich denke nicht, dass das möglich ist, man könnte es mit Doppelparens vortäuschen ... solange man die Argumente nicht einzeln braucht.
quelle
Wenn der Compiler verschiedene Makros nicht versteht, können Sie PRINT auch mit einer der folgenden Optionen entfernen:
oder
Der erste kommentiert die PRINT-Anweisungen aus, der zweite verhindert den PRINT-Befehl aufgrund einer NULL-if-Bedingung. Wenn die Optimierung festgelegt ist, sollte der Compiler niemals ausgeführte Anweisungen entfernen, z. B.: If (0) print ("Hallo Welt"); oder ((nichtig) 0);
quelle
if
Version von "Nicht tun", die die Codestruktur berücksichtigt, lautet:if (0) { your_code } else
Ein Semikolon, nachdem Ihre Makroerweiterung das beendet hatelse
. Diewhile
Version sieht folgendermaßen aus:while(0) { your_code }
Das Problem mit derdo..while
Version ist, dass der Codedo { your_code } while (0)
garantiert einmal ausgeführt wird. In allen drei Fällenyour_code
ist es richtig , wenn es leer istdo nothing gracefully
.Hier für g ++ erklärt, obwohl es Teil von C99 ist, sollte es für alle funktionieren
http://www.delorie.com/gnu/docs/gcc/gcc_44.html
schnelles Beispiel:
quelle
__VA_ARGS__
auch als Erweiterung, obwohl sie auch von Compilern in früheren Versionen unterstützt werden.