如何使用 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 宏更简单、更便携。