2018/02/24

[c/c++]memory.hは標準ヘッダではない

よくやってしまうのだが、malloc()やmemcpy()を使ったのに、ヘッダファイルを追加し忘れていることがある。
まあ、コンパイル時にエラーが出るので分かるのだが、問題はその次だ。
どれをインクルードするとよいのだっけ?


ふっと思いつくのが、連続データに対する処理だからストリング命令、ということで<string.h>。
しかし、心の中で「もしかしたら<memory.h>だったかも・・・」と心配になる。
コンパイルすればわかるのだけど、なんか追加した標準ヘッダを間違えるって、なんか素人っぽいじゃないか。
できれば、修正後は一発で正解したいのだ。

そして、malloc()/free()は<stdlib.h>だということを思い知らされるのである。。。

どうでもいいけど、strcpy()なんかも<string.h>に入っていると、文字列用のヘッダだと勘違いしてしまうよね。


それはさておき。
<stdlib.h>と<string.h>をインクルードすれば何とかなるのはわかるが、では<memory.h>には何が入っているのだろう?

オライリーのCクイックリファレンスで調べてみたのだが・・・<memory.h>は標準ヘッダではなかった!
そうか、そうなんだ・・・。

/usr/include/memory.hを見ると、<features.h>と<string.h>をインクルードしているだけだった。
<features.h>なんて通常はインクルードさせたことが無かったのだが、GLIBCのバージョンなどいろいろ定義されている。
じゃあ、単に<string.h>をインクルードするより<memory.h>の方がいいのか?と思ったが、<string.h>も先頭で<features.h>をインクルードしていた。


というわけで、私の結論はこうだ。

  • <string.h>でも<memory.h>でもいい
  • <memory.h>は標準ヘッダではないので、すべてのコンパイラが持っているかは定かでは無い
  • 標準ヘッダでないからといって、<memory.h>をインクルードしていても変ではない


標準じゃないからといって、使って問題があるわけではないのだ。
それに、個人的には「str***()」は<string.h>に、「mem***()」は<memory.h>に、となっていた方がわかりやすいと思う。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。