A
anon.asdf
Here is a possible solution in the form of working code: [snip]
#include <stdio.h>
#define CONCAT_X(mp_t1, mp_t2)mp_t1##mp_t2
#define CONCAT(mp_t1, mp_t2)CONCAT_X(mp_t1, mp_t2)
#define PLACE_X(mp_fp)mp_fp()
#define PLACE_1(mp_fp)PLACE_X(mp_fp)
#define PLACE_2(mp_fp)PLACE_X(mp_fp), PLACE_X(mp_fp)
#define PLACE_3(mp_fp)PLACE_2(mp_fp), PLACE_X(mp_fp)
#define PLACE_4(mp_fp)PLACE_3(mp_fp), PLACE_X(mp_fp)
#define PLACE_5(mp_fp)PLACE_4(mp_fp), PLACE_X(mp_fp)
#define PLACE_6(mp_fp)PLACE_5(mp_fp), PLACE_X(mp_fp)
#define PLACE_7(mp_fp)PLACE_6(mp_fp), PLACE_X(mp_fp)
#define PLACE_8(mp_fp)PLACE_7(mp_fp), PLACE_X(mp_fp)
#define PLACE_9(mp_fp)PLACE_8(mp_fp), PLACE_X(mp_fp)
#define PLACE_10(mp_fp)PLACE_9(mp_fp), PLACE_X(mp_fp)
#define PLACE(mp_fp, mp_d)CONCAT(PLACE_, mp_d)(mp_fp)
It also works with CONCAT_X (directly) on the line above:
#define PLACE(mp_fp, mp_d)CONCAT_X(PLACE_, mp_d)(mp_fp)
typedef struct foo_s {
int i;
char a;
} foo_t;
#define FOO_STATICINIT(mp_fp, mp_d) { \
PLACE(mp_fp, mp_d) \
}
^In case someone just copies and gets a compile error - the reason
will be the empty line above }.
#define MYARRAY_DEPTH_1() 4
#define MYARRAY_DEPTH_2() 7
#define MYARRAY_INIT_1() {1, 'x'}
#define MYARRAY_INIT_2() {5, 'a'}
static foo_t g_foo1[MYARRAY_DEPTH_1()] =
FOO_STATICINIT(MYARRAY_INIT_1, MYARRAY_DEPTH_1());
static foo_t g_foo2[MYARRAY_DEPTH_2()] =
FOO_STATICINIT(MYARRAY_INIT_2, MYARRAY_DEPTH_2());
int main(void) {
{
int i;
for(i = 0; i < MYARRAY_DEPTH_1(); ++i) {
printf("g_foo1[%i].i(%i)\ng_foo1[%i].a(%c)\n----\n",
i, g_foo1.i, i, g_foo1.a);
}
puts("\n\n_____________________________\n\n");
for(i = 0; i < MYARRAY_DEPTH_2(); ++i) {
printf("g_foo2[%i].i(%i)\ng_foo2[%i].a(%c)\n----\n",
i, g_foo2.i, i, g_foo2.a);
}
}
puts("\n\n\n\
_______________________\npress <enter> to exit...\n");
return getchar();
} [snip]
Does that do what you want?
Yes, unbelievable!
Thanks for that! I'm trying to figure out how it does what it does!
Things like removing "()" from a macro, and passing it along
#define MYARRAY_INIT_1() {1, 'x'}
...
static foo_t g_foo1[MYARRAY_DEPTH_1()] =
FOO_STATICINIT(MYARRAY_INIT_1, MYARRAY_DEPTH_1());
and then putting it back at the end, are sneaky!
#define PLACE_X(mp_fp)mp_fp()
And I've got an idea what it's for, but I cannot deduce the
"semantics"...
I'll probably have to read up on the preprocessor to fully understand
it.
-Albert