8

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を返します。

4

2 に答える 2

9

一般に、これを行うには外部で何かを行う必要があります。たとえば、検索パスをいじって(コメントで提案されているように)、フォールバックとして空を提供したり、内部をfoo.hラップしたりするなどです。コンパイラスイッチによる設定( gcc / clangなど)。#include#ifdef HAS_FOO_H#endifHAS_FOO_H-DHAS_FOO_H

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

于 2012-07-19T21:43:47.870 に答える
8

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 は、うまく連携するため) を使用する場合は、この優れたチュートリアルから始めることをお勧めします。

于 2012-07-19T21:40:30.143 に答える