これら2つの機能の違いはどれですか? MinGW4.8.0を使用しています。
そんなこと知ってる gmtime_r
はスレッドセーフです(ただし、同じスレッドから複数回呼び出された場合は安全ではありません)が、私にはわかりませんgmtime_s
違いは、 gmtime_r(3)
は 標準のSUSv2関数 であるということです。 Windows環境でgmtime_r()
に最も近いのは gmtime_s()
で、引数が逆になっています。
gmtime_r(const time_t*, struct tm*)
gmtime_s(struct tm*, const time_t*)
基本的に、どちらも時間値をtm
構造に変換します。 gmtime_r
次に、この構造体へのポインタ(または、失敗した場合はNULL
)を返しますが、gmtime_s
戻り値 0
成功した場合、およびerrno_t
失敗した場合。
上記の両方のドキュメントからわかるように、tm
構造の本体は次のとおりです。
struct tm {
int tm_sec; /* seconds */
int tm_min; /* minutes */
int tm_hour; /* hours */
int tm_mday; /* day of the month */
int tm_mon; /* month */
int tm_year; /* year */
int tm_wday; /* day of the week */
int tm_yday; /* day in the year */
int tm_isdst; /* daylight saving time */
};
gmtime_r
およびlocaltime_r
は標準のPOSIX関数です。
それらの主な目的は、スレッドセーフ(再入可能)です。基本的なgmtime
関数とlocaltime
関数は、結果を格納するために単一の静的領域を使用するため、スレッドセーフまたは再入可能ではありません。したがって、gmtime_r
およびlocaltime_r
結果を保存する場所へのポインタを取得します。
gmtime_s
およびlocaltime_s
はMicrosoftによって導入され、現在はC11の一部ですが、 Microsoft以外のサポートは制限されています 。 (詳細については、 ここ を参照してください。)
それらの主な目的はセキュリティです。これらは、Microsoftの Secure CRT (Secure C Run-Time)の一部として追加されました。私の理解では、MicrosoftのCRTのgmtime
とlocaltime
はスレッドごとに割り当てられているため、これらの関数の静的出力領域はスレッドセーフの問題ではありません。代わりに、gmtime_s
およびlocaltime_s
Secure CRTを実行するために追加されました パラメータ検証 。 (つまり、パラメーターがNULLかどうかをチェックします。NULLの場合は、エラー処理を呼び出します。)