4

有没有办法仅在编译器可用时才包含库?

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

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

有没有办法做这个验证?

4

1 回答 1

4

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 这样的程序部署的方法。

于 2018-05-21T22:30:20.893 回答