_GNU_SOURCE 和 __USE_GNU

37

我想使用CPU_SET,它是glibc Linux特定的宏,在sched.h中应该定义。手册明确指出必须定义_GNU_SOURCE才能定义该宏。然而,查看头文件时,仅当__USE_GNU被定义时才定义了CPU_SET(有一个#ifdef保护)。我好像记得几年前需要_GNU_SOURCE

问题:

1)手册显然有误。我该如何通知维护人员手册有误?

2)从何时开始过渡从_GNU_SOURCE__USE_GNU(版本或时间方面)?

3)是否存在新版本的glibc仍使用_GNU_SOURCE的情况?还是我可以放心地假定定义__USE_GNU就足够了?


回答:
1)您可以通过向相关项目的维护者发送电子邮件来通知他们手册有误。
2)自glibc 2.20以来,过渡从_GNU_SOURCE__USE_GNU已经完成。此更改可能在其他版本中进行了部分实施,但是glibc 2.20是最早支持该更改的版本。
3)在新版本的glibc中,_GNU_SOURCE仍然被支持并保留了向后兼容性。因此,在使用旧代码或需要与旧版本的glibc进行兼容性时,定义_GNU_SOURCE可能仍然是必要的。但是,定义__USE_GNU通常足以满足大多数需求。
2个回答

50

_GNU_SOURCE 是唯一应该自行定义的标识符。当定义了 _GNU_SOURCE 时,features.h(所有其他 glibc 头文件都包含它)内部通过一种机制定义了 __USE_GNU,并可能在其他条件下也会定义。自行定义或取消定义 __USE_GNU 将严重破坏 glibc 头文件。


如果我只使用“_GNU_SOURCE”,仍然会出现错误。还有其他想法吗?为什么会发生这种情况? - Foo Bah
14
所有特性测试宏,如_GNU_SOURCE,必须在包含任何标准头文件之前定义。不能等到需要该宏的头文件之前才定义它。 - R.. GitHub STOP HELPING ICE
1
最终我不得不在最内层的头文件顶部定义"_GNU_SOURCE",但它起作用了 :) - Foo Bah
11
最好将其放在源文件的顶部,甚至更好的方法是在编译器命令行中以“-D_GNU_SOURCE”形式传递。这样就没有疑问它从一开始就被定义了。 - R.. GitHub STOP HELPING ICE
在旧的SPARC平台上,我必须手动#include <features.h>才能使其正常工作,而无需显式定义__USE_GNU - marshall.ward

14

在任何其他定义之前,您必须定义_GNU_SOURCE。这段代码在此处有效:

#define _GNU_SOURCE
#include <sched.h>


int main()
{
    cpu_set_t set;
    CPU_SET(0, &set);
    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接