2012-07-19 8 views
6

私がfoo.hにBARを定義するとします。しかしfoo.hは存在しないかもしれません。コンパイラが私に不平を言うことなく、どうすればそれを含めることができますか? BARはfoo.hという2として定義されている場合がfoo.hが存在しない場合がfoo.hが存在し、1場合ヘッダーファイルを含めるにはどうすればよいですか?

#include "foo.h" 

#ifndef BAR 
#define BAR 1 
#endif 

int main() 
{ 
    return BAR; 
} 

したがって、プログラムは2を返します。

+0

'BAR'を定義する独自のフォールバックfoo.hを提供し、それに応じてコンパイラの検索パスを設定しますか? –

+0

私はそれをすることができると思います。フォールバックfoo.hに何かを含める必要があるのはなぜですか? – theanine

+0

可能な複製[ファイルが存在するかどうかを知るためにCプリプロセッサを使用できますか?](http://stackoverflow.com/questions/142877/can-the-c-preprocessor-be-used-to-tell-if- a-file-exists) –

答えて

8

一般に、これを行うには外部の操作が必要です。 (コメントに示唆されているように)検索パスを使って遊んで、空のfoo.hを返すか、 ... #endifの中に#includeをラップし、コンパイラスイッチでHAS_FOO_Hを設定することで、gcc/clangの-DHAS_FOO_H等。)。

特定のコンパイラを使用していて移植性に問題がないことが分かっている場合は、拡張子として存在するファイルと存在しないファイルを含むコンパイラがサポートされていることに注意してください。たとえば、clangの__has_include機能を参照してください。

+0

2番目のfoo.hフォールバックファイルは最も簡単な解決方法です。 – theanine

+1

実際の 'foo.h'が内部ヘッダーガード' #define'を変更すると、微妙な破損が発生するので、これはまた悪い解決策です。 –

+1

なぜですか?フォールバックfoo.hは空です。 – theanine

6

GNU Autoconfのようなツールを使用してください。これはそのためのものです。 (WindowsではCMakeを使用することをお勧めします)。

だからあなたconfigure.acで、次のような行があるだろう:

あなたは、このようにテストすることができ HAVE_FOO_Hを定義する configureを実行した後、
AC_CHECK_HEADERS([foo.h]) 

#ifdef HAVE_FOO_H 
#include "foo.h" 
#else 
#define BAR 1 
#endif 

君場合をautotoolsのルート(autoconfとautomakeはうまくいっているので、autoconfとautomakeです)を使いこなそうとしていますが、これはexcellent tutorialから始めることをお勧めします。

+0

Autotoolsは...うんざりしている可能性があり、最近はまったく必要ありません。 MacとLinuxには優れたCMakeサポートがありますが、他にも素晴らしいビルドシステム([SCons](http://www.scons.org/)など)があります。 ESRには特に注目すべきポストがあります:[Autotools must die](http://esr.ibiblio.org/?p=1877)。 – sfstewman

+4

CMakeが引き起こす痛みは、autotoolsをはるかに超えています。 http://news.ycombinator.com/item?id=2357014 MSVCに基づいたビルドタイプのモデルをUNIXの土地に強制し、適切なデータ構造が欠けている新しい不器用なプログラミング言語が付属しています。ランダムなものを組み込んだアドホックな方法で拡張されています(qt4 !? fltk !?)。 ESRの暴動は、すべてのvitriolと物質です。私はいくつかのプロジェクトでCMake、SCons、autotoolsを使ってきました。私はほとんど毎回autotoolsに行くつもりです。 autotoolsを置き換えるには、makefileをコンパイルしないでください。 'make'のモデルは微妙に壊れており、代わりにそれを理解しなければなりません。 –

関連する問題