Во встроенном проекте я использую библиотеку, которая предоставляет макрос для инициализации структуры. Это обеспечивает разумные значения по умолчанию, но значения по умолчанию зависят от других параметров. Я хочу переопределить одно или несколько значений этого назначенного инициализатора, потому что последующая инициализация значений приводит к накладным расходам.
В идеале я не хочу копировать и вставлять все макросы, потому что тогда мне придется управлять сторонним кодом. Если библиотека изменит свои значения по умолчанию, я тоже не хочу этого делать.
Есть ли способ объединить или переопределить назначенные инициализаторы, чтобы не было накладные расходы? Код должен быть совместимым с C99 и переносимым.
Пример кода для демонстрации проблемы:
#if SITUATION
#define LIBRARY_DEFAULTS \
{ \
.field_a = 1, \
.field_b = 2, \
.field_c = 3 \
}
#else
#define LIBRARY_DEFAULTS \
{ \
.field_a = 100, \
.field_b = 200, \
.field_c = 300, \
.field_d = 400, \
.field_e = 500 \
}
#endif
/* The following is what I want (or similar), but (of course) doesn't
work. */
// #define MY_DEFAULTS = LIBRARY_DEFAULTS + { .field_a = 100 }
int main(void) {
/* The exact definition of something also depends on situation. */
struct something library_thing = LIBRARY_DEFAULTS;
/* This generates overhead, and I want to avoid this. It is certain
that the field exists. */
library_thing.field_a = 100;
}
#define LIBRARY_DEFAULTS { .field_a = 1, .field_b = 2, .field_c = 3, OPTIONAL_USER_DEFAULTS }
, где вы должны выбрать, определить ли этот дополнительный макрос, тогда вы могли бы сделать это (#define OPTIONAL_USER_DEFAULTS .field_a = 100
) и вы не получили бы никакого предупреждения от GCC, если бы вы не указали-Woverride-init
(который устанавливается-Wextra
, но не-Wall
). Но зацепа нет. Вы могли бы подумать о том, чтобы предварительно обработать заголовок библиотеки, чтобы предоставить хук, но это было бы беспорядочно. - person Jonathan Leffler   schedule 20.02.2016library_thing.field_a = 100
. Я называю это накладными расходами, если просто хочу переопределить значение по умолчанию сразу после инициализации значений по умолчанию. - person BasilFX   schedule 24.02.2016