什么是_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已经出来,现在默认在已知支持它们的平台上自动启用nanosleep
和sched_yield
。 不再需要使用--enable-libstdcxx-time
。