• ベストアンサー

localtime() 関数についての質問

C言語の勉強をして間もない者です。 time_t = current; struct tm = *local; time(&current); local = localtime(&current); こんなのがlocaltime関数を使った一般的なプログラムだと思いますが、なぜlocaltimeの引数がcurrentのポインタなのでしょうか? 別にcurrentには値を代入しないのだから、localtime(current)でもいいとおもうのですが、ポインタにした必然的理由があるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • knb-nkm
  • ベストアンサー率66% (4/6)
回答No.3

#1です。外していたみたいなので、再度検索。 #2の方のおっしゃる通り、歴史的な事情というのが正解みたいですね。 参考URLによると、UNIXの初期の頃に、下記の様に実装されていたのを 引きずってるということですね。 int *localtime(int tvec[2]); 今時のCPUなら、殆どが、32ビット以上の整数型を扱えるので、 上記の様な実装は、16ビットCPU時代の遺産ということでしょう。

参考URL:
http://www.hi-matic.org/diary/?20100817

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

time.h には他にも変なインターフェイスを持つ関数がいますし, なんとなく「過去からの遺産」以上の意味はないような気がします. ちなみに #1 の参考に挙げられている回答は完全に外していると言っていいと思います. C の仕様では, 型 time_t は算術型でなければなりません (従って構造体であることはありえない).

JoyWorld
質問者

お礼

回答ありがとうございます。 たしかにtime_t はlong型という説明は見たことがあります。 

  • knb-nkm
  • ベストアンサー率66% (4/6)
回答No.1

私も気になったので調べてみました。 参考URLに、同様の質問がありました。回答の正否は分かりませんが... もし、time_t が構造体だったら、値で渡すとコピーするサイズが大きくなって 効率が落ちるので、ポインターで渡す必然性が出てきます。 今のところ、time_t を構造体にしている実装に出会った事はありませんが、 typedef で指定されているので、構造体として実装される可能性はあります。 標準関数のインターフェースを変更することは非常に望ましくないので、 構造体として実装される可能性の有る引数については、ポインターを渡すようにしている。 ということの様です。

参考URL:
http://cboard.cprogramming.com/c-programming/113572-localtime-curiosity.html
JoyWorld
質問者

お礼

回答ありがとうございます。 こんなページあるんですね。 英語の勉強しなくちゃ(´・ω・`)

関連するQ&A