_GLIBCXX_USE_NANOSLEEP というプリプロセッサ マクロが、次の 2 つの標準ヘッダー ファイルに含まれています。
- 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 */
一方、threadでは、 と の定義は、定義するマクロstd::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 の詳細に注意してください。