在编译C程序之前,如何检查库是否可用

时间:2018-05-21 22:24:26

标签: c macros compilation-time

只有在编译器可用时才有可能包含库吗?

我考虑用#ifndef检查它(如下所示),但它只检查是否未定义宏名称,我真正需要的是检查编译器是否可以在编译中到达C库时间。

#ifndef _MY_LIBRARY_H
    #include "my_library.h"
#endif

有没有办法进行此验证?

1 个答案:

答案 0 :(得分:3)

Clang和GCC很长一段时间都有__has_include macro,您可以这样使用:

#if __has_include("my_library.h")
    #include "my_library.h"
#endif

它也适用于尖括号(实际上,它适用于你可以传递给#include的任何东西):

#if __has_include(<my_library.h>)
    #include <my_library.h>
#endif

__has_include最近受到了约束standard C++17,这意味着现在不支持它的C ++编译器很可能会在一个不太远的特性中使用它。由于它是一个预处理器功能,与C ++编译器属于同一套件的C编译器也很有可能通过渗透来获得该功能。

请注意,虽然__has_include会告诉您头文件是否存在,但在安装中断的情况下,它不会使您免于最终的链接器错误。

执行此操作的老式方法是使用预构建脚本尝试编译#include "my_library.h",并将#define HAS_LIBRARY_SOMETHING的配置文件输出为0或1,具体取决于结果操作。这是autoconf部署等程序的方法。