Hi, Am 30.07.2008 08:05 schrieb David Haller:
Mehrstufig. Erklären kann ich jetzt grad nicht *gähn*:
==== t.c ==== #define N_FOO 1 #define N_BAZ 4
#ifdef N_FOO #define _TABLE_ENTRY_FOO { "FOO", N_FOO }, #else #define _TABLE_ENTRY_FOO #endif #ifdef N_BAR #define _TABLE_ENTRY_BAR { "BAR", N_BAR }, #else #define _TABLE_ENTRY_BAR #endif #ifdef N_BAZ #define _TABLE_ENTRY_BAZ { "BAZ", N_BAZ }, #else #define _TABLE_ENTRY_BAZ #endif
#define TABLE_ENTRY(x) _TABLE_ENTRY_ ## x
static const struct { const char *s; int v; } table[] = { TABLE_ENTRY(FOO) TABLE_ENTRY(BAR) TABLE_ENTRY(BAZ) { NULL, 0 } }; ====
$ cpp t.c | sed '/^$/d' # 1 "t.c" static const struct { const char *s; int v; } table[] = { { "FOO", 1 },
{ "BAZ", 4 }, { NULL, 0 } };
Das sollte doch sein, was du suchst, odr?
Nicht ganz. Was ich suche, ist eine leichter handhabbare Alternative zu #ifdef N_FOO { "FOO", N_FOO }, #endif #ifdef N_BAR { "BAR", N_BAR }, #endif #ifdef N_BAZ { "BAZ", N_BAZ }, #endif Deine Version ist da eher noch mühsamer zu schreiben.
Evtl. könnte man, je nach dem was die Expansion der Makros sein soll, weiter makroisieren...
Anwendung ist eine Übersetzungstabelle String <-> numerischer Wert für
die Liste der Line Disciplines in