組み込みプロジェクトで、構造体を初期化するためのマクロを提供するライブラリを使用しています。これにより妥当なデフォルトが提供されますが、デフォルトは他のパラメータに依存します。後で値を初期化するとオーバーヘッドが発生するため、この指定された初期化子の 1 つ以上の値をオーバーライドしたいと考えています。
理想的には、サード パーティのコードを管理する必要があるため、すべてのマクロをコピー アンド ペーストしたくありません。ライブラリがデフォルトを変更した場合、私もそれをしたくありません。
指定された初期化子を組み合わせたりオーバーライドしたりする方法があるので、オーバーヘッドはありませんか? コードは 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;
}