foo.hでBARを定義するとします。ただし、foo.hは存在しない可能性があります。コンパイラが私に文句を言わずに、どうすればそれを含めることができますか?
#include "foo.h"
#ifndef BAR
#define BAR 1
#endif
int main()
{
return BAR;
}
したがって、BARがfoo.hで2として定義されている場合、プログラムはfoo.hが存在する場合は2を返し、foo.hが存在しない場合は1を返します。
foo.hでBARを定義するとします。ただし、foo.hは存在しない可能性があります。コンパイラが私に文句を言わずに、どうすればそれを含めることができますか?
#include "foo.h"
#ifndef BAR
#define BAR 1
#endif
int main()
{
return BAR;
}
したがって、BARがfoo.hで2として定義されている場合、プログラムはfoo.hが存在する場合は2を返し、foo.hが存在しない場合は1を返します。
一般に、これを行うには外部で何かを行う必要があります。たとえば、検索パスをいじって(コメントで提案されているように)、フォールバックとして空を提供したり、内部をfoo.h
ラップしたりするなどです。コンパイラスイッチによる設定( gcc / clangなど)。#include
#ifdef HAS_FOO_H
#endif
HAS_FOO_H
-DHAS_FOO_H
特定のコンパイラを使用していて、移植性が問題ではないことがわかっている場合、一部のコンパイラは、拡張子として存在する場合と存在しない場合があるファイルを含めることをサポートしていることに注意してください。たとえば、clangの__has_include
機能を参照してください。
GNU Autoconfのようなツールを使用してください。そのために設計されています。(Windows では、CMakeを使用することをお勧めします)。
したがって、 にconfigure.ac
は次のような行があります。
AC_CHECK_HEADERS([foo.h])
を実行した後、次のようにテストできる をconfigure
定義します。HAVE_FOO_H
#ifdef HAVE_FOO_H
#include "foo.h"
#else
#define BAR 1
#endif
autotools ルート (autoconf と automake は、うまく連携するため) を使用する場合は、この優れたチュートリアルから始めることをお勧めします。