【问题标题】:_GNU_SOURCE and __USE_GNU_GNU_SOURCE 和 __USE_GNU
【发布时间】:2011-11-09 22:48:39
【问题描述】:

我想使用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 就足够了吗?

【问题讨论】:

    标签: c++ c linux gnu glibc


    【解决方案1】:

    你必须先定义_GNU_SOURCE。这个 sn-p 在这里工作:

    #define _GNU_SOURCE
    #include <sched.h>
    
    
    int main()
    {
        cpu_set_t set;
        CPU_SET(0, &set);
        return 0;
    }
    

    【讨论】:

      【解决方案2】:

      _GNU_SOURCE 是您唯一应该定义自己的人。当_GNU_SOURCE 被定义时,__USE_GNU 是通过features.h(包含在所有其他glibc 头文件中)中的一种机制在内部定义的,并且可能在其他条件下。自己定义或取消定义 __USE_GNU 会严重破坏 glibc 标头。

      【讨论】:

      • 如果我只使用_GNU_SOURCE,我仍然会得到错误。关于它为什么会发生的任何其他想法?
      • 所有功能测试宏如_GNU_SOURCE 必须any标准头被包含之前定义。你不能等到你需要它的标题之前再定义它。
      • 我最终不得不在最内部的头文件的第一行定义_GNU_SOURCE,但它起作用了:)
      • 它确实应该在源文件的第一行,或者更好的是,在编译器的命令行上,格式为-D_GNU_SOURCE。那么毫无疑问,它是从一开始就定义的。
      • 在较旧的 SPARC 平台上,我必须手动 #include &lt;features.h&gt; 才能使其正常工作,而无需明确定义 __USE_GNU
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 2010-10-08
      • 2018-10-30
      • 2021-11-11
      • 1970-01-01
      • 2019-04-16
      • 2013-08-24
      相关资源
      最近更新 更多