一个名为 _GLIBCXX_USE_NANOSLEEP 的预处理器宏出现在两个标准头文件中:
- c++/4.7.1/x86_64-unknown-linux-gnu/bits/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 */
而在threadstd::this_thread::sleep_for()
中,和的定义std::this_thread::sleep_until()
取决于要定义的宏。如果没有定义,这两个函数——尽管 C++ 标准要求——也不会被定义。
在我的系统(glibc 2.15)上,宏没有定义,尽管nanosleep()
函数(在 中声明ctime
)存在并且可以运行。
我想知道这是怎么回事以及如何处理它。具体来说:
- 正如这篇文章所建议的那样,在构建 GCC 以默认激活此宏时是否应该使用配置选项?(我在构建过程的在线文档中找不到任何内容。)
nanosleep()
函数和宏之间真的有关系吗?nanosleep()
inctime
/的声明time.h
似乎不依赖或定义宏。-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 的更多细节。