通过预处理器检查库是否存在

checking whether library exist via preprocessor

有两个库zconf.hunistd.h,至少用来获取进程的pid。我通常在 Mac OSX 和 Ubuntu 18.04 上测试我的代码,其中他们最好使用 zconf.h(编译器提供 zconf.h 代替 unistd.h)如果我忘记添加,那么如果代码有效,就可以了。然而,在前几天我需要在另一台机器上测试代码 AFAIR 它有 Ubuntu 10 或 12。它的编译器抱怨没有 zconf.h。我想知道是否有办法检查一台机器有zconf.h,如果没有,使用unistd.h。可以使用

这样的预处理器来完成吗
#ifdef ITS_IF_CONDITION
    #include <zconf.h>
#else
    #include <unistd.h>

较新版本的 GCC、clang 和 MSVC 编译器实现了 __has_include 功能。尽管它是 C++ 17 的一个特性,但我相信这三个特性在纯 C 中也都支持它。

但传统的(可能更便携)方法是在构建过程之前检查配置脚本中包含文件的存在。两者 autoconf and cmake 都有实现此目的的方法。

#ifdef __has_include
    #if __has_include(<zconf.h>)
        #include <zconf.h>
    #else
        #include <unistd.h>
    #endif
#else
    #include <unistd.h>
#endif