我有一个需要特定头文件的 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 预处理器吗?
答案 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.