只有在编译器可用时才有可能包含库吗?
我考虑用#ifndef
检查它(如下所示),但它只检查是否未定义宏名称,我真正需要的是检查编译器是否可以在编译中到达C库时间。
#ifndef _MY_LIBRARY_H
#include "my_library.h"
#endif
有没有办法进行此验证?
答案 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部署等程序的方法。