埋め込みCの世界では、構成の詳細をヘッダーに格納することが多いため、オーバーヘッドやコンパイルされたサイズを最小限に抑えてライブラリを特定のタスク用に構築できます。ifステートメントを使用したコンパイル時の設定
一つの例は次のようになります。
//libnameConf.h
#define LIBNAME_WAVE LIBNAME_A
typedef enum {
LIBNAME_A,
LIBNAME_B,
LIBNAME_C
} libname_wave_t;
//libname.c
double coef_arr_a[100] = {...};
double coef_arr_b[100] = {...};
double coef_arr_c[100] = {...};
if (LIBNAME_WAVE == LIBNAME_A) {
somestruct.waveCoefs = coef_arr_a;
//do other coef_arr_a specific stuff
} else if (LIBNAME_WAVE == LIBNAME_B) {...}
我々は、コンパイラは明らかに我々は唯一たいので、良いことである崩壊することにif文を使用しているこの特定のケースについてcoef_arr_aを参照して、他のものがバイナリにコンパイルされずに領域を占有するようにします。
残念ながら、これは、この警告を回避し、より良い方法はあります警告
warning: comparison between 'enum <anonymous>' and 'enum <anonymous>' [-Wenum-compare]
得?
あなたの列挙型の名前を指定しますか? –
明快にするためにenumを編集しました。名前をつけても警告に違いはありません。 – pdel
私はプリプロセッサやマクロの使用を推奨する人ではありませんが、このような場合は、実際には最も一般的であり、コンパイル時には必ず評価されます。あなたの 'if'文は、良いコンパイラがおそらくそれをしているにもかかわらず、コンパイラによって評価されたり最適化されたりする必要はありません。特に、コンパイラが実際に非分岐分岐のコードを省略する必要はありません。ちょうどそれを飛び越えても、まだそれを行うかもしれません。 –