什么是_GLIBCXX_USE_NANOSLEEP?

名为_GLIBCXX_USE_NANOSLEEP的预处理器macros出现在两个标准头文件中:

  • C ++ / 4.7.1 / x86_64的未知-Linux的GNU /比特/ C ++的config.h
  • C ++ / 4.7.1 /线程

在GCC 4.7.1(Linux,64位)的默认版本中, c ++ config.h包含的唯一东西就是这个注释:

/* Defined if nanosleep is available. */ /* #undef _GLIBCXX_USE_NANOSLEEP */ 

而在线程中std::this_thread::sleep_for()std::this_thread::sleep_until()定义取决于要定义的macros。 如果没有定义,那么这两个函数 – 尽pipe是C ++标准所要求的 – 都不会被定义。

在我的系统(glibc 2.15)中,虽然nanosleep()函数(在ctime声明)存在且可操作,但未定义该macros。

我想知道这是什么和如何处理它。 特别:

  • 正如本文所build议的那样,在构buildGCC的时候应该使用一个configuration选项来默认激活这个macros? (我在构build过程的在线文档中找不到任何内容。)
  • nanosleep()函数和macros之间真的有关系吗? nanosleep()ctime / time.h中的声明似乎不依赖于或定义macros。
  • 在我自己的头文件中定义macros是否有特定的风险,或者在命令行中使用-D选项(如本相关问题中所build议的)? 如果我在nanosleep()不可用的系统上执行此操作,又怎么能find?

更新从GCC 4.8开始,对std::this_thread::sleep_for()等的支持自动包含在libstdc ++中。 不再需要configuration标志。 从GCC 4.8更改日志 :

this_thread :: sleep_for(),this_thread :: sleep_until()和this_thread :: yield()是定义的,不需要configuration选项–enable-libstdcxx-time;

但请注意Jonathan的答案中提供的GCC 4.8和4.9的更多细节。

当libstdc ++被构build时,它的configure脚本会testing你的系统,看看哪些function被支持,并且根据结果定义(或者取消定义) c++config.h各种macros

在你的情况configure确定POSIX nanosleep()函数不可用,macros没有定义。 但是,正如你所说, nanosleep()可以在你的系统上使用。 它没有被configure启用的原因是,除非你使用--enable-libstdcxx-time选项(在libstdc ++手册的configuration章节中logging ,而不是在GCCconfiguration文档中),否则它的检查甚至不会运行。

  • 正如本文所build议的那样,在构buildGCC的时候应该使用一个configuration选项来默认激活这个macros? (我在构build过程的在线文档中找不到任何内容。)

是的, --enable-libstdcxx-time

  • nanosleep()函数和macros之间真的有关系吗? nantimeleep()在ctime / time.h中的声明似乎不依赖于或定义macros。

glibc函数的声明不依赖于libstdc ++的macros,否。 但macros告诉libstdc ++是否使用该函数。

  • 在我自己的头文件中定义macros是否有特定的风险,或者在命令行中使用-D选项(如本相关问题中所build议的)? 如果我在nanosleep()不可用的系统上执行此操作,又怎么能find?

这是调皮,没有支持,但将工作。 macros是一个内部的实现细节,应该由configuration而不是由用户设置,并且改变实现的内部macros的定义可能会破坏事物。 但在这种情况下,它不会因为依赖它的唯一代码是在头文件中, libstdc++.so没有库代码, libstdc++.so会受到影响。

但是最好重新安装GCC并使用--enable-libstdcxx-time选项,否则编辑你的c++config.h来将macros定义为true。

如果你在不能使用nanosleep()的不同系统上定义它,当你包含#include <thread>时,你会得到一个编译错误。

我有一些改进configuration的想法 ,所以nanosleep()sched_yield()默认会被检查,但是我还没有时间去处理它们。

更新:我已经提交了一些更改,以便在不使用--enable-libstdcxx-time情况下构buildGCC 4.8仍然会定义std::this_thread::yield() (作为no-op),并将实现std::this_thread::sleep_for()std::this_thread::sleep_until() ,而不是::nanosleep() 。 尽pipe如此,定义--enable-libstdcxx-time更好。

另一个更新: GCC 4.9.0已经出来,现在默认在已知支持它们的平台上自动启用nanosleepsched_yield 。 不再需要使用--enable-libstdcxx-time