раздел моего вопроса
аюсь применитьX Macro концепция, чтобы иметь возможность инициализировать все элементы структуры к пользовательскому значению по умолчанию (недействительным). Я пишу следующий код:
#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;
Однако, когда я запускаю препроцессор, определениеfoo_DEFAULT_VALUE
не может заменитьX(name)
звонки с-1,
Выход препроцессора:
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?*/
я думалC-макросы могут ссылаться на другие макросы, Вы знаете, почему эта замена не удалась? Есть ли обходной путь?
Я мог бы жить сfoo_invalidate
, но я не хочу отказываться от шага от значения, которое будет использоваться непосредственно при инициализации.