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

时间:2018-07-06 08:15:58

标签: c macros c-preprocessor

有两个库zconf.hunistd.h,它们至少用于获取流程的pid。我通常会在Mac OSX和Ubuntu 18.04上测试我的代码,如果我忘了添加代码,则最好使用zconf.h(编译器提供zconf.h代替unistd.h),如果我忘记添加代码,那么如果代码有效,没关系。但是,在前一天,我需要在另一台装有Ubuntu 10或12的计算机上测试代码。其编译器抱怨没有zconf.h。我想知道是否有一种方法可以检查机器是否有zconf.h,如果没有,请使用unistd.h。可以使用像这样的预处理器吗?

#ifdef ITS_IF_CONDITION
    #include <zconf.h>
#else
    #include <unistd.h>

1 个答案:

答案 0 :(得分:4)

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

但是传统的(可能是更可移植的)方法是在构建过程之前检查配置脚本中包含文件的存在。 autoconfcmake都有实现此目标的方法。

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