如何包含可能存在或不存在的头文件?

the*_*ine 7 c gcc include header-files

我们假设我在foo.h中定义了BAR.但是foo.h可能不存在.如果没有编译器向我抱怨,我如何包含它?

#include "foo.h"

#ifndef BAR
#define BAR 1
#endif

int main()
{
    return BAR;
}
Run Code Online (Sandbox Code Playgroud)

因此,如果在foo.h中将BAR定义为2,则如果foo.h存在则程序将返回2,如果foo.h不存在则返回1.

Mat*_*ery 8

在一般情况下,你需要做一些外部要做到这一点-例如,通过做一些喜欢玩与周围的搜索路径(如在评论中所建议的),并提供一个空foo.h作为备用,或包裹#include#ifdef HAS_FOO_H... #endifHAS_FOO_H由编译器开关设置(-DHAS_FOO_H用于gcc/clang等).

如果您知道您正在使用特定的编译器,并且可移植性不是问题,请注意某些编译器支持包括可能存在或不存在的文件作为扩展.例如,请参阅clang的__has_include功能.


Jac*_*lly 7

使用像GNU Autoconf这样的工具,就是它的设计目标.(在Windows上,您可能更喜欢使用CMake).

所以在你的configure.ac,你有一个像:

AC_CHECK_HEADERS([foo.h])
Run Code Online (Sandbox Code Playgroud)

在运行之后configure,将定义HAVE_FOO_H哪个,您可以像这样测试:

#ifdef HAVE_FOO_H
#include "foo.h"
#else
#define BAR 1
#endif
Run Code Online (Sandbox Code Playgroud)

如果你打算沿着autotools路线(即autoconf和automake,因为它们可以很好地协同工作),我建议你从这个优秀的教程开始.

  • CMake造成的痛苦远远超过了autotools.http://news.ycombinator.com/item?id=2357014.它迫使MSVC启发的构建类型模型进入unix领域,带来了一种新的笨拙的编程语言,缺少适当的数据结构,以内置随机内容的特殊方式扩展(qt4!?fltk!?).ESR的咆哮都是讽刺,没有任何实质内容.我在几个项目中使用过CMake,SCons和autotools,我几乎每次都会使用autotools.要替换autotools,您需要不编译为makefile.`make`的模型被巧妙地打破,替换者必须明白这一点. (4认同)