Próbuję zastosować koncepcję X Macro, aby mieć możliwość inicjowania wszystkich członków struktury do niestandardowej wartości domyślnej (nieprawidłowej). I napisać następujący kod:Dlaczego ta zagnieżdżona wymiana makr nie działa?
#define LIST_OF_STRUCT_MEMBERS_foo \
X(a) \
X(b) \
X(c)
#define X(name) int name;
struct foo {
LIST_OF_STRUCT_MEMBERS_foo
};
#undef X
#define X(name) -1,
static inline void foo_invalidate(struct foo* in) {
*in = (struct foo){
LIST_OF_STRUCT_MEMBERS_foo
};
}
#undef X
#define X(name) -1,
#define foo_DEFAULT_VALUE { LIST_OF_STRUCT_MEMBERS_foo }
#undef X
static struct foo test = foo_DEFAULT_VALUE;
Jednak kiedy uruchomić preprocesora, definicja foo_DEFAULT_VALUE
nie zastępować połączenia X(name)
z wyjściem -1,
Preprocessor:
struct foo {
int a; int b; int c;
};
static inline void foo_invalidate(struct foo* in) {
*in = (struct foo){
-1, -1, -1, /*Here the substitution worked nicely*/
};
}
static struct foo test = { X(a) X(b) X(c) }; /*Why this substitution failed?*/
myślałem C-macros could refer to other macros . Czy wiesz, dlaczego ta substytucja zawodzi? Czy istnieje jakieś obejście?
Mogłem żyć z foo_invalidate
, ale nie chcę zrezygnować z wartości, która ma być użyta bezpośrednio przy inicjalizacji.
Masz 'X (name)' zdefiniowany jako '-1,' wokół '# define' dla' foo_DEFAULT_VALUE', ale nie tam, gdzie faktycznie * użyłeś * go. Potrzebujesz makra 'X' zdefiniowanego tam, gdzie występuje podstawienie, wokół linii' static struct foo test = foo_DEFAULT_VALUE; '. – Dmitri