假设我在 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
作为后备,或者将#include
内部包裹一个#ifdef HAS_FOO_H
...#endif
和HAS_FOO_H
由编译器开关设置(-DHAS_FOO_H
用于 gcc/clang 等)。
如果您知道您正在使用特定的编译器,并且可移植性不是问题,请注意某些编译器确实支持将可能存在或可能不存在的文件作为扩展名包含在内。例如,参见 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,因为它们可以很好地协同工作),我建议您从这个优秀的教程开始。