2017-08-02 9 views
0

次の例では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で定義されたことをしたことを私に伝えます。

どのようにして、これらの関数のサブセットがコンパイル時に選択された動作を持つことができるのでしょうか?

+0

Makefileに必要な実装を含む.cファイルのみを指定し、他の実装の.cファイルはプログラムから除外することができます。代わりに、各実装の周りに異なる#ifdefガードを使用し、-DUSE_GET_VALUE_1などをコンパイラに渡して、必要な実装のみが実際にコンパイルされるようにすることができます。 –

+0

@Jeremy私はあなたが複数のifdefガードの意味を理解していると思う。それはうまくいくが完全に理想的ではない。私はIRLをターゲットにしている2つのプラットフォームと2つ以上の機能を備えています。これらのプラットフォームには、インターフェースの要件に関してかなり不規則なオーバーラップもあります。 – DeepDeadpool

答えて

3

default.cにはweak、プラットフォームファイルには "normal"としてください。したがって、platform.cファイルがこの関数をweakではないとして実装すると、弱いものからdefault.cがリンク時に置き換えられます。

(それはプラグマ、属性または何か他のことができます - あなたは、コンパイラーのドキュメントをチェックインする必要があります)これは、標準の一部ではありませんが、ほとんどのコンパイラはそれをサポート

gccのバージョン:

#define __weak __attribute__((weak)) 

/* interface.h * 
***************/ 
int get_value_1(); 
int get_value_2(); 

/* default.c * 
*************/ 
#include "interface.h" 

#ifndef GET_VALUE_1 
__weak int get_value_1() { return -1; } 
#endif 

#ifndef GET_VALUE_2 
__weak 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 
+0

おそらく、「弱い」は標準の一部ではないことに言及する価値があります(例えば、移植性に関する)。とにかく、「弱い」を説明するための+1。 –

+0

優れた提案。私は今それを試してみましょう。 default.cの中であなたの__と単語weakの間にスペースがあることを意味しましたか? – DeepDeadpool

+0

フォーマット中に間違って追加されたことはありません –

関連する問題