有没有办法仅在编译器可用时才包含库?
我考虑过检查它#ifndef
(如下所示),但它只是检查是否未定义宏名称,而我真正需要的是检查编译器是否可以在编译时访问 C 库。
#ifndef _MY_LIBRARY_H
#include "my_library.h"
#endif
有没有办法做这个验证?
有没有办法仅在编译器可用时才包含库?
我考虑过检查它#ifndef
(如下所示),但它只是检查是否未定义宏名称,而我真正需要的是检查编译器是否可以在编译时访问 C 库。
#ifndef _MY_LIBRARY_H
#include "my_library.h"
#endif
有没有办法做这个验证?
Clang 和 GCC 有一个__has_include
宏已经很长时间了,你可以像这样使用它:
#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
最近被指定为标准 C++17,这意味着现在不支持它的 C++ 编译器很可能会在不太遥远的功能中拥有它。由于它是预处理器功能,因此与 C++ 编译器属于同一套件的 C 编译器也很有可能通过 osmosis 获得该功能。
不过,请注意,虽然它__has_include
会告诉您是否存在头文件,但在安装损坏的情况下,它不会使您免于最终的链接器错误。
执行此操作的老式方法是拥有一个尝试编译的预构建脚本,并根据该操作的结果#include "my_library.h"
输出一个 0 或 1 的配置文件。#define HAS_LIBRARY_SOMETHING
这是像 autoconf 这样的程序部署的方法。