在一个嵌入式项目中,我使用了一个库,该库提供了一个用于初始化结构的宏。这提供了合理的默认值,但默认值取决于其他参数。我想覆盖这个指定初始化器的一个或多个值,因为之后初始化这些值会产生开销。
理想情况下,我不想复制粘贴所有宏,因为我必须管理第三方代码。如果库更改它的默认值,我也不想这样做。
有没有一种组合或覆盖指定初始化器的方法,所以没有开销?代码必须符合 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;
}