3

C 標準ライブラリの新しいバージョンのスレッド セーフ関数に関して、これらがプリプロセッサ定義を介して利用可能かどうかをクロスプラットフォームで確認する方法はありますか? などの機能を指していますlocaltime_r()

標準的な方法がない場合、GCC で信頼できる方法は何ですか? [編集] または、unistd.h を使用した posix システムですか?

4

1 に答える 1

3

これをテストする標準的な方法はありません。つまり、すべてのプラットフォームでテストする方法はありません。のようなツールautoconfは、この関数を呼び出す小さなCプログラムを作成し、それをコンパイルしてリンクしようとします。これが機能する場合は、関数が存在するように見えますが、存在しない場合は、存在しない可能性があります(または、コンパイラオプションが間違っているため、適切CFLAGSに設定する必要があります)。

したがって、基本的に6つのオプションがあります。

  1. それらが存在することを要求します。コードは、それらが存在するプラットフォームでのみ機能します。限目。それらが存在しない場合、コンパイルは失敗しますが、プラットフォームが最小要件に違反しているため、それは問題ではありません。

  2. それらの使用は避けてください。スレッドセーフではないものを使用する場合、おそらくグローバルロック(ミューテックスなど)によって保護されている場合、それらが存在するかどうかは関係ありません。もちろん、コードはPOSIXミューテックスを備えたプラットフォームでのみ機能しますが、プラットフォームにPOSIXミューテックスがない場合、POSIXスレッドもありません。また、POSIXスレッドがない場合(おそらくPOSIXスレッドを使用していると思います) / o代替手段をサポートする)、そもそもなぜスレッドの安全性について心配する必要があるのでしょうか。

  3. 実行時に決定します。プラットフォームに応じて、「弱いリンク」を実行して、関数が見つかったかどうかを実行時にテストするか(関数へのポインターが見つからなかったNULLかどうかを指す)、または次のようなものを使用してシンボルを動的に解決します。dlsym()(これも実際には移植性がありませんが、Linux / UNIXの世界で広くサポートされています)。ただし、その場合、実行時に関数が見つからない場合はフォールバックが必要です。

  4. のようなautoconfツール、同様の機能を備えた他のツール、または独自の構成スクリプトを使用して、コンパイルを開始する前にこれを決定します(結果に応じてプリプロセッサマクロを設定することもできます)。その場合、フォールバックソリューションも必要になります。

  5. 使用をよく知られているプラ​​ットフォームに制限します。この機能が特定のプラットフォームで利用可能かどうかは通常わかっています(そして、一度利用可能になると、将来はなくなることはありません)。ほとんどのプラットフォームは、プリプロセッサマクロを公開して、どの種類のプラットフォームであるか、場合によってはどのバージョンであるかをテストします。たとえば、GNU / Linux、Android、Free / Open / NetBSD、Solaris、iOS、MacOS Xがすべてこの機能を提供していることがわかっている場合は、これらのプラットフォームのいずれかでコンパイルしているかどうかをテストし、提供している場合はそれを使用します。コードが別のプラットフォーム用にコンパイルされている場合(またはどのプラットフォームであるかを判断できない場合)、この機能を提供する場合と提供しない場合がありますが、確実に言うことはできないため、安全を確保してフォールバックを使用してください。

  6. ユーザーに決定させます。ユーザーがサポートを通知していない限り、常にフォールバックを使用するか、逆の方法で実行します(おそらくより理にかなっています)。常にフォールバックがあると想定し、コンパイルが失敗した場合に、ユーザーがコードを「互換性」に強制できる方法を提供します。 「モード」、スレッドセーフ機能が使用できないことを何らかの方法で指定することによって(たとえば、環境変数を設定するか、別のmakeターゲットを使用することによって)。もちろん、これは(貧しい)ユーザーにとって最も便利な方法ではありません。

于 2013-02-08T00:01:21.787 に答える