有一个名为_GLIBCXX_USE_NANOSLEEP的预处理宏出现在两个标准头文件中:
- c++/4.7.1/x86_64-unknown-linux-gnu/bits/c++config.h
- c++/4.7.1/thread
在默认情况下构建的GCC 4.7.1(Linux,64位)中,c++config.h仅包含此注释:
/* Defined if nanosleep is available. */
/* #undef _GLIBCXX_USE_NANOSLEEP */
在thread中,std::this_thread::sleep_for()
和std::this_thread::sleep_until()
的定义取决于宏的定义。如果没有定义,尽管C++标准需要这两个函数,但两个函数都不会被定义。
在我的系统(glibc 2.15)中,该宏未定义,尽管nanosleep()
函数(在ctime
中声明)存在并可操作。
我想知道这是什么意思以及如何处理它。具体而言:
- 是否有配置选项应该在构建GCC时使用,以默认激活此宏,如此帖子所建议的?(我在构建过程的在线文档中找不到任何内容。)
nanosleep()
函数和该宏是否真的有关?ctime
/time.h
中的nanosleep()
声明似乎不依赖于或定义该宏。- 在我的头文件或命令行上作为
-D
选项定义该宏时,是否存在特定风险(如此相关问题中建议的)?如果我在没有nanosleep()
可用的系统上这样做,会发生什么情况,我如何找出?
更新从GCC 4.8开始,支持std::this_thread::sleep_for()
等函数已自动包含在libstdc++中。不再需要配置标志。从GCC 4.8更改日志中:
this_thread::sleep_for()、this_thread::sleep_until()和this_thread::yield()定义无需使用--enable-libstdcxx-time配置选项;
但请注意,对于GCC 4.8和4.9,在Jonathan的回答中给出了进一步的细节。
configure
是否检查nanosleep
?它有什么提示? - nneonneoconfigure --enable-libstdccxx-time
,如 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52680 所示。这通常是由库维护者完成的,但这不是一个文档化的标志。 - nneonneogrep nanosleep config.log
没有任何输出? - nneonneo