如何使用 C 预处理器查找 glibc 版本?

Swi*_*ank 7 glibc c-preprocessor

从 2.19 开始,glibc 需要_DEFAULT_SOURCE被定义才能stdlib.h定义putenv()。在此之前它需要_SVID_SOURCE.

有什么方法可以让代码神奇地检测它所拥有的 glibc 版本,从而定义正确的_SOURCE符号,甚至是 glibc 是否存在?

ric*_*ici 12

__GLIBC__您可以使用和宏检查 glibc 版本__GLIBC_MINOR__。(例如,在版本 2.29 中,__GLIBC__is 2 和__GLIBC_MINOR__is 29。)每个 glibc 标头都会设置这些宏,因此您可以在第一个#include. 不幸的是,对于这个特定的用例来说已经太晚了,因为您需要在包含任何系统标头之前#define对宏进行功能测试。

幸运的是,对于您问题中提出的特定问题,无需检查 glibc 版本。

putenv是Posix中的XSI(X/开放系统接口)扩展,您可以通过放置#define _XOPEN_SOURCE在第一个系统头包含之前来请求XSI扩展。这适用于所有 glibc 版本以及大多数其他标准库实现。因此,它比特殊的仅 glibc 功能测试宏更简单、更可移植。