Макрос препроцессора с именем _GLIBCXX_USE_NANOSLEEP появляется в двух стандартных файлах заголовка:
- С++/4.7.1/x86_64-неизвестно-Linux-гну/бит/c++ config.h
- С++/4.7.1/поток
В сборке по умолчанию GCC 4.7.1 (Linux, 64-бит) единственное, что включает С++ config.h, это комментарий:
/* Defined if nanosleep is available. */
/* #undef _GLIBCXX_USE_NANOSLEEP */
В то время как в потоке определение std::this_thread::sleep_for()
и std::this_thread::sleep_until()
зависит от макроса, который должен быть определен. Если он не определен, обе функции – хотя это требуется для С++ Standard – также не будут определены.
В моей системе (glibc 2.15) макрос не определен, хотя функция nanosleep()
(объявленная в ctime
) существует и работает.
Я хотел бы знать, что это значит и как с этим бороться. В частности:
- Есть ли опция конфигурации, которая должна использоваться при создании GCC для активации этого макроса по умолчанию, как предложено этим сообщением? (Я не смог найти в онлайн-документацию процесса сборки.)
- Есть ли связь между функцией
nanosleep()
и макросом? Объявлениеnanosleep()
вctime
/time.h
, похоже, не зависит от макроса или не определяет его. - Существует ли какой-либо конкретный риск для определения макроса в моих собственных файлах заголовков или как опция
-D
в командной строке (как предложено в этот связанный вопрос)? Что делать, если я делаю это в системе, гдеnanosleep()
недоступен, и как я могу узнать об этом?
Обновление Начиная с GCC 4.8, поддержка std::this_thread::sleep_for()
и тому подобное автоматически включается в libstdС++. Флаг конфигурации не требуется больше. Из журнал изменений GCC 4.8:
this_thread:: sleep_for(), this_thread:: sleep_until() и this_thread:: yield() определены без необходимости использования опции configure --enable-libstdcxx-time;
Обратите внимание на дальнейшие подробности этого для GCC 4.8 и 4.9, приведенные в ответе Джонатана.