通过预处理器检查库是否存在
checking whether library exist via preprocessor
有两个库zconf.h
和unistd.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
有两个库zconf.h
和unistd.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