Variadic makros - Auf einzelne parameter zugreifen?

Orbit

Erfahrenes Mitglied
Hi,

ich will etwas Schreibwarbeit schreiben und eine Funktion per Makro definieren, die aus
_do_something(var1, var2, var3... nvar_n) einen Code bastelt der die einzelnen vars beinhaltet, zB
f(var1);
f(var2);
...
Ich finde nur beispiele wo ich die Liste dann zB an prontf übergebe, da dort eine variable Anzahl erlaubt ist kein problem aber ich will die einzelnen parameter; kp wie tut man sowas? geht das überhaupt?

LG und danke,
Orbit
 
Ich glaube eine variable Anzahl an Parametern geht bei Makros nicht.

Könntest du näher die Verwendung beschreiben, vielleicht gibt es elegantere Methoden.
 
Hallo,

ich habe eine Aktion, die in einer bestimmten Funktion auf viele Variablen angewendet wird, es geht um den Kopierkonstruktor (und eine ähnliche Funktion).
Da das ganze sehr viele Subklassen hat würde ich gerne nur die zu kopierenden Variablen in ine Liste schreiben udn fertig, anstatt pro variable:
this->var = other.var;
zu schreiben.
Klingt jetzt vil faul, geht aber nach 30-40 Subklassen mit je 10 Variablen doch auf den Sack;-)
LG

EDIT:
achso, ne Variable Anzahl bei Maktros geht auf jeden Fall, weiß nur nicht wie ich die einzelnen items abgreife.
http://www.delorie.com/gnu/docs/gcc/cpp_19.html
 
Das wusste ich gar nicht. Wäre interessant zu wissen, wie das geht :)

Ist das nur auf den GCC beschränkt?
Nein. Variadic Macros sind Teil von C99, aber nicht von C++. Wobei sich die Variadic Macros beim GCC durch zusätziche Features im Gegensatz zum C99 Standard auszeichnen.

@Orbit: Dazu brauchst du aber dieses Feature nicht unbedingt. Schau dir mal Boost.Preprocessor an.

Hab jetzt grad keine Zeit, evtl. schreib ich später noch was...

\edit: Ich habe gerade mal ein paar Makros geschrieben und mit dem GCC getestet:
C:
/* Anzahl von Argumenten ermitteln (max. 5) */
#define NARGS(...) \
    NARGS_(__VA_ARGS__, 5, 4, 3, 2, 1)
#define NARGS_(_1, _2, _3, _4, _5, N, ...) N

/* auf N-tes Argument zugreifen */
#define ARG(N, ...) ARG_I(N)(__VA_ARGS__)

#define ARG_I(X) ARG_ ## X

#define ARG_0(x, ...) x
#define ARG_1(_0, x, ...) x
#define ARG_2(_0, _1, x, ...) x
#define ARG_3(_0, _1, _2, x, ...) x
#define ARG_4(_0, _1, _2, _3, x, ...) x

/* Makro für jedes Argument ausführen */
#define FOREACH(CODE, ...) \
    FOREACH_I(NARGS(__VA_ARGS__))(CODE, __VA_ARGS__)

#define FOREACH_I(I) FOREACH_II(I)
#define FOREACH_II(I) FOREACH_ ## I

#define FOREACH_0(...)
#define FOREACH_1(CODE, ...) CODE(ARG(0, __VA_ARGS__))
#define FOREACH_2(CODE, ...) FOREACH_1(CODE, __VA_ARGS__); CODE(ARG(1, __VA_ARGS__))
#define FOREACH_3(CODE, ...) FOREACH_2(CODE, __VA_ARGS__); CODE(ARG(2, __VA_ARGS__))
#define FOREACH_4(CODE, ...) FOREACH_3(CODE, __VA_ARGS__); CODE(ARG(3, __VA_ARGS__))

#define ASSIGN(X) this->X = other.X

FOREACH(ASSIGN, a, b, c, d);
Resultat von "gcc -E -P test.c":
C:
this->a = other.a; this->b = other.b; this->c = other.c; this->d = other.d;

Wobei 30 - 40 Subklassen riecht irgendwie nach einem Designproblem...

Gruß
 
Zuletzt bearbeitet:
Zurück