次の例では4つのファイルがあります。ヘッダー、デフォルトの実装ファイル、および2つのプラットフォーム固有の実装ファイルが含まれています。 get_value_1
およびget_value_2
。 'デフォルト'の振る舞いは-1を返しますが、これらの関数の中には特別な実装があります。別のファイルで実装されていない場合にのみ-1を返すようにしたいと思います。コンパイル時に関数の動作を選択するにはどうすればよいですか?
/* interface.h *
***************/
int get_value_1();
int get_value_2();
/* default.c *
*************/
#include "interface.h"
#ifndef GET_VALUE_1
int get_value_1() { return -1; }
#endif
#ifndef GET_VALUE_2
int get_value_2() { return -1; }
#endif
/* platform1.c *
***************/
#include "interface.h"
#ifndef GET_VALUE_1
#define GET_VALUE_1
int get_value_1() { return 1; }
#endif
/* platform2.c *
***************/
#include "interface.h"
#ifndef GET_VALUE_2
#define GET_VALUE_2
int get_value_2() { return 2; }
#endif
しかし、私はコマンドgcc default.c platform1.c -shared -fpic -o platform1.so
を実行すると、それは私が乗算get_value_1機能を定義し、それは元々platform1.cで定義されたことをしたことを私に伝えます。
どのようにして、これらの関数のサブセットがコンパイル時に選択された動作を持つことができるのでしょうか?
Makefileに必要な実装を含む.cファイルのみを指定し、他の実装の.cファイルはプログラムから除外することができます。代わりに、各実装の周りに異なる#ifdefガードを使用し、-DUSE_GET_VALUE_1などをコンパイラに渡して、必要な実装のみが実際にコンパイルされるようにすることができます。 –
@Jeremy私はあなたが複数のifdefガードの意味を理解していると思う。それはうまくいくが完全に理想的ではない。私はIRLをターゲットにしている2つのプラットフォームと2つ以上の機能を備えています。これらのプラットフォームには、インターフェースの要件に関してかなり不規則なオーバーラップもあります。 – DeepDeadpool