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

C 通过预处理器检查库是否存在,c,macros,c-preprocessor,C,Macros,C Preprocessor,有两个库zconf.h和unistd.h,用于至少获取流程的pid。我通常在MacOSX和Ubuntu18.04上测试我的代码,它们最好使用zconf.h(编译器提供zconf.h来代替unistd.h),如果我忘记添加,那么如果代码可以工作,就可以了。然而,在前一天,我需要在另一台装有Ubuntu10或Ubuntu12的机器上测试代码。它的编译器抱怨没有zconf.h。我想知道是否有办法检查机器是否有zconf.h,如果没有,请使用unistd.h。可以使用预处理器来完成吗 #ifdef IT

有两个库
zconf.h
unistd.h
,用于至少获取流程的
pid
。我通常在MacOSX和Ubuntu18.04上测试我的代码,它们最好使用
zconf.h
(编译器提供
zconf.h
来代替
unistd.h
),如果我忘记添加,那么如果代码可以工作,就可以了。然而,在前一天,我需要在另一台装有Ubuntu10或Ubuntu12的机器上测试代码。它的编译器抱怨没有
zconf.h
。我想知道是否有办法检查机器是否有
zconf.h
,如果没有,请使用
unistd.h
。可以使用预处理器来完成吗

#ifdef ITS_IF_CONDITION
    #include <zconf.h>
#else
    #include <unistd.h>
#ifdef其_IF_条件
#包括
#否则
#包括

较新版本的GCC、clang和MSVC编译器实现了该功能。虽然它是C++ 17的特性,但我相信所有三个都在普通C中支持它。 但是传统的(可能更便于移植的)方法是在构建过程之前检查配置脚本中是否存在include文件。两者都有实现这一目标的方法

#ifdef __has_include
    #if __has_include(<zconf.h>)
        #include <zconf.h>
    #else
        #include <unistd.h>
    #endif
#else
    #include <unistd.h>
#endif
\ifdef\u包含
#如果u_有u include()
#包括
#否则
#包括
#恩迪夫
#否则
#包括
#恩迪夫

较新版本的GCC、clang和MSVC编译器实现了该功能。虽然它是C++ 17的特性,但我相信所有三个都在普通C中支持它。 但是传统的(可能更便于移植的)方法是在构建过程之前检查配置脚本中是否存在include文件。两者都有实现这一目标的方法

#ifdef __has_include
    #if __has_include(<zconf.h>)
        #include <zconf.h>
    #else
        #include <unistd.h>
    #endif
#else
    #include <unistd.h>
#endif
\ifdef\u包含
#如果u_有u include()
#包括
#否则
#包括
#恩迪夫
#否则
#包括
#恩迪夫

我知道的唯一的
zconf.h
是zlib的一部分。如果您想使用
getpid()
,您应该只使用
#include
,这将适用于所有unix系统。如果您发现现有答案解决了您的问题,您可以接受它。如果它缺少一点点,你可以添加它作为评论或者编辑答案。如果你自己想出了一个解决方案,你可以把它作为一个新的答案发布。但请不要将答案编辑到您的问题中。
defined
使用标识符。定义了
之后(\uu有\u include
唯一可能的有效令牌是
,而不是
(同样,我不知道你在说什么
zconf.h
。如果你说的是zlib,那是用于压缩的,而不是PIDs.Dude,它在第1行中说“zconf.h——zlib压缩库的配置”。这是zlib使用的内部头。您不应该在自己的代码中使用它。此外,它是在您构建/安装zlib时由
configure
脚本动态生成的(这是“autoconf”所指的cyco130)。我知道的唯一
zconf.h
是zlib的一部分。如果您想使用
getpid()
,您应该只添加
#包含
,这将适用于所有unix系统。如果您发现现有答案解决了您的问题,您可以接受它。如果缺少一点,您可以将其添加为注释或编辑答案。如果您自己提出了解决方案,您可以将其作为新答案发布。但请不要编辑answe进入你的问题。
defined
接受一个标识符。
defined之后(\uuu拥有\u include
唯一可能的有效令牌是
,而不是
(再说一遍,我不知道你在说什么
zconf.h
。如果你说的是zlib,那是压缩,不是PIDs.Dude,它在第1行说“zconf.h——zlib压缩库的配置”。这是zlib使用的内部头文件。您不应该在自己的代码中使用它。此外,它是在您构建/安装zlib时由
configure
脚本动态生成的(这就是cyco130在“autoconf”中所指的内容)。