如何使用 C 预处理器查找 glibc 版本?
how to find glibc version with C preprocessor?
glibc 自 2.19 起要求定义 _DEFAULT_SOURCE
以获得 stdlib.h
以定义 putenv()
。在此之前它需要 _SVID_SOURCE
.
有没有什么方法可以让代码神奇地检测到它拥有哪个版本的 glibc,从而定义正确的 _SOURCE
符号,甚至 glibc 是否存在?
您可以使用 __GLIBC__
和 __GLIBC_MINOR__
宏检查 glibc 版本。 (例如,在版本 2.29 中,__GLIBC__
是 2,__GLIBC_MINOR__
是 29。)每个 glibc header 都会设置这些宏,因此您可以在第一个 #include
之后测试它们。不幸的是,对于这个特定的用例来说为时已晚,因为您需要 #define
feature-test 宏 在 包含任何系统 header 之前。
幸运的是,对于您问题中提出的特定问题,无需检查 glibc 版本。
putenv
是 Posix 中的 XSI(X/Open 系统接口)扩展,您可以通过在第一个系统 [=30] 之前放置 #define _XOPEN_SOURCE
来请求 XSI 扩展=] 包括。这将适用于所有 glibc 版本,以及大多数其他标准库实现。所以它比特殊的 glibc-only feature-test 宏更简单、更便携。
glibc 自 2.19 起要求定义 _DEFAULT_SOURCE
以获得 stdlib.h
以定义 putenv()
。在此之前它需要 _SVID_SOURCE
.
有没有什么方法可以让代码神奇地检测到它拥有哪个版本的 glibc,从而定义正确的 _SOURCE
符号,甚至 glibc 是否存在?
您可以使用 __GLIBC__
和 __GLIBC_MINOR__
宏检查 glibc 版本。 (例如,在版本 2.29 中,__GLIBC__
是 2,__GLIBC_MINOR__
是 29。)每个 glibc header 都会设置这些宏,因此您可以在第一个 #include
之后测试它们。不幸的是,对于这个特定的用例来说为时已晚,因为您需要 #define
feature-test 宏 在 包含任何系统 header 之前。
幸运的是,对于您问题中提出的特定问题,无需检查 glibc 版本。
putenv
是 Posix 中的 XSI(X/Open 系统接口)扩展,您可以通过在第一个系统 [=30] 之前放置 #define _XOPEN_SOURCE
来请求 XSI 扩展=] 包括。这将适用于所有 glibc 版本,以及大多数其他标准库实现。所以它比特殊的 glibc-only feature-test 宏更简单、更便携。