Es ist möglich, aber Sie müssen einige manuelle Arbeit tun und haben eine Obergrenze.
#define BUILD0(x) x[0]
#define BUILD1(x) BUILD0(x), x[1]
#define BUILD2(x) BUILD1(x), x[2]
#define BUILD3(x) BUILD2(x), x[3]
#define BUILD(x, i) BUILD##i(x)
Und beachten Sie, dass i
sollte ein Ganzzahlliteral sein, keine Konstante berechneten Wert.
BTW, der Präprozessor ist leistungsfähiger als was normalerweise ist, aber die Verwendung dieser Macht ist ziemlich schwierig. Boost bietet eine Bibliothek, die einige Dinge erleichtert, einschließlich Iteration. Siehe Boost Preprocessor Library. Es gibt eine andere Bibliothek für solche Dinge, aber der Name entzieht sich mir im Moment.
Bearbeiten: Die Boost Preprocessor-Bibliothek verwendet eine ähnliche Technik. Mit zusätzlichen Tricks, um einige Probleme mit Eckenfehlern zu lösen, teilen Sie Implementierungsmakros zwischen Einrichtungen auf höherer Ebene, umgehen Compilerfehler, etc ... die übliche Boost-Komplexität, die im Kontext einer allgemeinen Bibliothek normal ist, aber zuweilen ein einfaches Verständnis davon verhindert die Umsetzungsprinzipien. Der wahrscheinlich auffälligste Trick besteht darin, eine Indirektionsstufe hinzuzufügen, so dass, wenn der zweite Parameter ein Makro sein kann, dieser erweitert wird. I.e. mit
#define BUILD_(x, i) BUILD##i(x)
#define BUILD(x, i) BUILD_(x, i)
kann man den Anruf
#define FOO 42
BUILD(x, FOO)
, die mit nicht möglich ist, was ich ausgesetzt.
verwandte: http://stackoverflow.com/questions/824639/variadic-recursive-preprocessor-macros-is-it-possible/893684 –
Welches Problem haben Sie wirklich zu lösen versuchen? dh. Wofür wird das Ergebnis dieses Makros verwendet? Kann die Verwendung leicht geändert werden, um eine Vorlagenlösung zu ermöglichen (wo Rekursion möglich ist)? –
Siehe meine letzte Änderung. –