Tl;dr
コンパイルに使用するレガシー コードを取得する必要がusleep()
ある場合は、他のライブラリよりも前にインクルードするヘッダー ファイルに次の行を追加します。
#define _XOPEN_SOURCE 600
#define _POSIX_C_SOURCE 200112L
または、コンパイラ フラグ-std=c11 -D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=200112L
をメイクファイルに追加します。
これは、非推奨ではなかったこの古いバージョンの UNIX API をプログラムが使用していることを環境に伝えます。usleep()
または、これが新しいコードである場合は間違いなく、 に置き換え、ライブラリのバージョンに合わせて機能テスト マクロを適切に設定usleep()
しnanosleep()
、コードベースを見直して他のビット腐敗を調べます。
Linux では、ライブラリがサポートする_XOPEN_SOURCE
との値を で確認できます。_POSIX_C_SOURCE
man feature_test_macros
全体像
より長い答え: これが何が起こっているかです。
歴史的にいくつかの異なる UNIX 標準があり、最終的に誰もが思いついたベスト プラクティスは、コードがどのバージョンの UNIX API 用に記述されているかをコードに指定することでした。プログラマーは、機能テスト マクロを定義することでこれを行いました。
UNIX における初期の分割の 1 つは、AT&T の System V とカリフォルニア大学の Berkeley Standard Distribution (BSD) の間でした。System V が公式バージョンであり、その動作がデフォルトになったのに対し、BSD Unix は初期のフリー ソフトウェアの一部であり、多くの大学で使用されていたため_BSD_SOURCE
、_SVID_SOURCE
. この_BSD_SOURCE
マクロは特に、40 年以上にわたってさまざまなオペレーティング システムの拡張機能を有効にしようとしています。非標準の拡張機能のキャッチオールとして使用されることもあります。両方のマクロは非推奨であり、現在受け入れられている回答に反して、新しいコードではどちらも使用しないでください。
今世紀には、IEEE 標準となった POSIX と、Open Group (X/Open) の Single Unix Specification (SUS) という 2 つの UNIX 標準がありました。X/Open SUS は POSIX のスーパーセットであり、通常はその目的で作成されます。以前は、これらの標準の当時の最新バージョンを有効にするために宣言できるさまざまな機能テスト マクロが多数ありましたが、これらは下位互換性のために引き続きサポートされています。貼り付けた条件にいくつか表示されますが、新しいコードを記述するときに気にする必要はありません。コードをチェックする 1 つのマクロ_XOPEN_SOURCE_EXTENDED
は現在は廃止されていますが、歴史的には 1995 年から SUS のバージョンが選択されていました。
理論的には、最新バージョンの UNIX または Linux で設定する正しい機能テスト マクロは_XOPEN_SOURCE
. ライブラリがサポートする最新のバージョン番号を調べる必要があります。実際には、他の誰もそれを矛盾して設定してコードを壊すことができないことを保証_POSIX_C_SOURCE
するために、も定義するのが賢明な防御コーディングだと思います。あなたの質問は良い例です。下位互換性を設定しても、ツールチェーンの他の場所でより新しいバージョンに設定されている場合、より高いバージョンのが優先され、機能しません。_XOPEN_SOURCE
_POSIX_C_SOURCE
_POSIX_C_SOURCE
usleep()
したがって、これらの条件が意味するのは、usleep()
これは POSIX 関数ではなく、BSD ライクな OS に一時的に存在していたため、1995 年に SUS に組み込まれたことです。2008 年に廃止され、POSIX またはそれ以来、SUS はそれを積極的に無効にします。したがって、SUS のバージョン 500 または 600 を選択すると有効になります (また、もう 1 つの廃止されたシノニムも有効にします) が、POSIX または SUS の最近のバージョンを選択すると非推奨になります。何でもありのオプションを選択した場合にも有効になりますが、それは悪い考えです.