55
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );

警告C4996:'localtime':この関数または変数は安全でない可能性があります。代わりにlocaltime_sの使用を検討してください。

time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime_s ( &rawtime );

localtimeをlocaltime_sに変更すると、次のようになります。エラーC2660:'localtime_s':関数は1つの引数を取りません

コードの最初のブロックで起こっていると思うことは次のとおりです。

  • 空のtime_t変数を作成します。
  • ctimeで定義されているtimeinfoへのポインタを作成します
  • rawtimeをrawtimeリファレンスに書き込みます
  • 生の時間を歩行者にとって意味のあるものに変換します

    1. 私は正しいですか?
    2. localtime_sにはどの2番目の入力パラメーターが必要ですか?
    3. 現地時間の安全性の問題全体を無視した場合に起こりうる最悪の事態は何ですか。
4

3 に答える 3

67

localtime静的に割り当てられた へのポインタを返しますstruct tm

localtime_s を使用して、構造体 tm へのポインターを渡し、localtime_sその結果データをそこに書き込むため、コードは次のように変更されます。

struct tm *timeinfo;
timeinfo = localtime(&rawtime);

次のようなものに:

struct tm timeinfo;
localtime_s(&timeinfo, &rawtime);

このようにして、独自のバッファーを持つのではなく、バッファーに書き込みます。

于 2013-01-17T19:54:41.907 に答える
8

localtime_s は localtime 関数の Microsoft 実装にすぎませんlocatime。C++ ISO 準拠であり、Microsoft だけが「非推奨」とマークしているため、安全に使用し続けることができます。localtime 関数自体は、C++ の世界ではまったく非推奨ではありません。

localtime_s 参照には、これらのパラメーターを渡す必要があると記載されています。

_tm 
Pointer to the time structure to be filled in.
 time 
Pointer to the stored time.
于 2013-01-17T19:52:40.797 に答える
6

Lightness Races in Orbitが指摘したように、他のいくつかの関数と同様に、スレッドセーフではlocaltimeありません。この件についてもっと知りたいと思っていたので、関連するブログ記事を見つけました。

localtime以下の引用は、スレッドセーフではない理由を説明しています。

[...] localtime は静的バッファー (std::tm*) へのポインターを返します。別のスレッドが関数を呼び出すことができ、最初のスレッドが構造体 std::tm* の内容の読み取りを完了する前に、静的バッファーが上書きされる可能性があります。

于 2013-07-18T04:29:55.227 に答える