2017-03-31 6 views
0

埋め込み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] 

得?

+0

あなたの列挙型の名前を指定しますか? –

+0

明快にするためにenumを編集しました。名前をつけても警告に違いはありません。 – pdel

+1

私はプリプロセッサやマクロの使用を推奨する人ではありませんが、このような場合は、実際には最も一般的であり、コンパイル時には必ず評価されます。あなたの 'if'文は、良いコンパイラがおそらくそれをしているにもかかわらず、コンパイラによって評価されたり最適化されたりする必要はありません。特に、コンパイラが実際に非分岐分岐のコードを省略する必要はありません。ちょうどそれを飛び越えても、まだそれを行うかもしれません。 –

答えて

1

変数と列挙型を使用する代わりにマクロを使用するのはどうでしょうか。

//libnameConf.h 
#define LIBNAME_A 
// #define LIBNAME_B // Uncomment this line and both comment the above line while changing libs. 

次に、このような条件付きコンパイル文をいくつか使用します。あなたがCでconditional compilaitonを必要とするよう

//libname.c 
double coef_arr_a[100] = {...}; 
double coef_arr_b[100] = {...}; 

#ifdef LIBNAME_A 
    somestruct.waveCoefs = coef_arr_a; 
    //do other coef_arr_a specific stuff 
#endif 
#ifdef LIBNAME_B 
    somestruct.waveCoefs = coef_arr_b; 
#endif 
+0

wikipediaに関する参考文献があります。トピック「Cプリプロセッサ」を検索できます。そのページでは、より複雑な条件付きコンパイルステートメントを使用して要件を満たすことができます。#ifdef xxx ...#elif defined xxx ... #endif – 0x2333

0

は聞こえるが、あなたがそれをやっている方法が正しくありません。条件付きコンパイルは、コンパイラの前に実行されるpreprocessorの概念です。プリプロセッサのポイントは、コンパイラに供給される前にソースコードを操作することです。プリプロセッサの条件文を使用していないので、コンパイル時の条件にかかわらず、すべてのソースコードがコンパイラに供給されます。バイナリを減らすためには、必ずプリプロセッサの条件文を使うべきです。

関連する問題