2012-03-09 9 views
9

私のCライブラリにはいくつかのオプション機能があり、automakeを使うことで、設定するフラグを提供することでそれらをオン/オフすることができます。パブリックヘッダファイルに条件文を入れるのは良い方法ですか?

機能がオフの場合、その機能はコンパイルされません。

しかし、私の質問は、その場合にも関数のプロトタイプをパブリックヘッダから削除する必要がありますか?

コンパイルされていない関数のプロトタイプを作成するのは良い考えではないようですが、でもは、ライブラリの設定によって異なるパブリックヘッダをインストールすることをお勧めしません。 (config.hをパブリックヘッダディレクトリにインストールするのは悪い習慣と同じです。)

オプションの機能については、パブリックヘッダにはどのような方法が最適ですか?ユーザーが無効な機能を使用しようとすると、コンパイル時またはリンク時にエラーが発生しますか?このような状況では、標準的な練習が必要です。 (私は複数のアイデアがある場合はGNUコーディング標準に準拠することを好むが、私はこの問題に関するGNUの標準を知らない。)

+1

Iそれは良い私だと思う関数が定義されていない場合は、プロトタイプを含めないようにしてください。そうすれば、リンク時ではなくコンパイル時にエラーが見つかるようになりますが、これに関する標準的な習慣はわかりません。 #ifを使用します。 –

+0

@VaughnCatoプロトタイプがプリプロセッサディレクティブによって除外されていると、コンパイラエラーが発生します。 –

+0

@LuchianGrigoreはい、正確です。 –

答えて

1

私は、この問題に対する2つの有効なアプローチ

  • があると思います
  • は、それぞれがそれはそう

設定リクに固有のものでありません#ifdefで複数のヘッダファイルを持っている特定の構成でサポートされていない機能を削除する#ifdefを使用して1つのヘッダーファイルを持っています与えられた設定のヘッダファイルにlibに存在しない関数を残すことは本当に悪い習慣です。それはコンパイル時エラーであるべきものをとり、それをリンカ1に移動します。

+1

私は2番目の提案が嫌いです、あなたは誤って手動でファイルを含めることができます。 –

+0

@LuchianGrigore私はそれが私の好みではないことに同意します。私はそれをすべて#ifdefsなしで1つのファイルにまとめた上でのステップと考えます。 – JaredPar

3

実装をコンパイルから除外するのではなく、関数全体を除外します。

//feature.h 
#ifndef EXCLUDE_FEATURE 
    void foo(); 
#endif 

//feature.c 
#include "feature.h" 
#ifndef EXCLUDE_FEATURE 
void foo() 
{ 
} 
#endif 

この方法で、あなたは除外機能でfooを使用しようとすると、エラーをリンカーない、コンパイラを取得します。できるだけ早くエラーを通知したいのであれば、一般的にリンカーのエラーは開発者の意図をあまり伝えません。

マイクロソフトはMFCのこれを(ヘッダーファイルの条件付きで)実行します。これは非常にうまく動作します。 。(C++ですが、原則スタンド当然の

+1

ありがとう、ありがとう。私はそれについて考えました、私の唯一の心配はconfig.hファイルを含むことに私に非常によく似ているということです - 特定のライブラリ設定が必ずしもヘッダーに反映されるべきではないという印象を受けました。ライブラリの複数のバージョンをインストールすることができました。これは本当に私の唯一のこのアプローチの懸念です。 – Steve

1

私はいくつかのプロジェクトでは、以下のアプローチを観察:テンプレート1からヘッダファイルを生成します

ファイルの生成が設定フラグに基づいています

このアプローチは、それがはるかにきれいなようで、私に...私にはヘッダーに終わることのない条件文の定義を使用するよりもきれいに見えた

短所:。。それは(スクリプト用)サポートの負担とすることができる

関連する問題