C预处理器能否检测到无法找到头文件并发出特定警告?

时间:2012-02-22 20:55:39

标签: include c-preprocessor

我有一个需要特定头文件的 C 文件。如果该头文件不存在,我希望预处理器发出特定的警告。类似的东西:

#if !(#include <special.h>)
#warning "Don't worry, you can fix this."
#warning "You just need to update this other repo over here:"
#endif

这可以通过 C 预处理器吗?

4 个答案:

答案 0 :(得分:16)

我知道这是一个老问题,但我也需要一种方法来做这件事,当我读到这些答案时,我很失望。事实证明,clang有一个很好的__has_include("header name")指令可以完美地运行你需要的东西:) 也许您想通过调用#if defined(__has_include)

来检查指令是否可用

答案 1 :(得分:9)

您可以随时检查所包含文件中的#define X宏是否已定义:)

答案 2 :(得分:7)

不,这是不可能的。你只能尝试#include标题,如果它不存在,编译器会给你一个错误。

另一种方法是使用像GNU autoconf这样的工具。 autoconf生成一个名为configure的shell脚本,它分析您的构建系统并确定是否安装了某些头文件,并生成一个由指示该信息的宏组成的头文件。

例如,如果您的构建系统包含标题HAVE_SYS_TIME_H,它可能会定义<sys/time.h>,因此您可以编写如下代码:

#if HAVE_SYS_TIME_H
#include <sys/time.h>
#else
#warning "Don't worry, you can fix this."
#endif

答案 3 :(得分:-4)

如果您需要的是一个警告,表明头文件不存在(并且没有自定义代码),那么大多数编译器都会给你一个。

$ LC_MESSAGES=en_US gcc -c bar.c
bar.c:1:17: fatal error: foo.h: No such file or directory
compilation terminated.