Вы можете решить проблему с помощью X-Macro
Вы бы изменили определение структуры на:
#define LIST_OF_foo_MEMBERS \
X(int,id) \
X(int,route) \
X(int,backup_route) \
X(int,current_route)
#define X(type,name) type name;
struct foo {
LIST_OF_foo_MEMBERS
};
#undef X
И тогда вы сможете легко определить гибкую функцию, которая устанавливает для всех полей значение dont_care
.
#define X(type,name) in->name = dont_care;
void setFooToDontCare(struct foo* in) {
LIST_OF_foo_MEMBERS
}
#undef X
После обсуждения здесь можно также определить значение по умолчанию следующим образом:
#define X(name) dont_care,
const struct foo foo_DONT_CARE = { LIST_OF_STRUCT_MEMBERS_foo };
#undef X
Что означает:
const struct foo foo_DONT_CARE = {dont_care, dont_care, dont_care, dont_care,};
И используйте его, как в hlovdal answer , с тем преимуществом, что здесь обслуживание проще, т. Е. Изменение количества членов структуры автоматически обновит foo_DONT_CARE
. Обратите внимание, что последняя "ложная" запятая является приемлемой .
Я впервые узнал концепцию X-Macros, когда мне пришлось решить эту проблему .
Это очень гибкий способ добавления новых полей в структуру. Если у вас разные типы данных, вы можете определить разные значения dont_care
в зависимости от типа данных: с здесь вы можете черпать вдохновение из функции, используемой для печати значений во втором примере.
Если вы в порядке со структурой all int
, вы можете опустить тип данных из LIST_OF_foo_MEMBERS
и просто изменить функцию X определения структуры на #define X(name) int name;